我正在尝试用这种方式构建一个有两个键的HashMap:首先我创建了一个只是数据结构的类.
public class Tarta { public String nome; public String data; public Tarta(String nome, String data) { this.nome = nome; this.data = data; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getData() { return data; } public void setData(String data) { this.data = data; } }
然后我通过在另一个类中写这个来填充我的地图:
mappaTarta.put(new Tarta(nome, data), peso);
在编译期间我没有错误,但是在测试时我得到了null,例如:
System.out.println(lr.leggiRecord().get(new Tarta("R", "15/11/2015")));
你能解释一下为什么吗?谢谢
如果要将项目用作a中的键HashMap
,则需要覆盖它们equals
和hashCode
方法.否则,默认实现将考虑使用相同参数创建的两个实例,因为它们是两个不同的实例.
目前:
Tarta a = new Tarta("foo", "bar"); Tarta b = new Tarta("foo", "bar"); System.out.println(a == b); // false System.out.println(a.equals(b)); // false System.out.println(a.hashCode() == b.hashCode()); // false
示例实现:
@Override public boolean equals(Object other) { if (other == this) return true; if (other instanceof Tarta) { Tarta that = (Tarta) other; return Objects.equals(this.name, that.name) && Objects.equals(this.data, that.data); } return false; } @Override public int hashCode() { return Objects.hash(name, data); }
然后:
Tarta a = new Tarta("foo", "bar"); Tarta b = new Tarta("foo", "bar"); System.out.println(a == b); // false - they are still different instances System.out.println(a.equals(b)); // true System.out.println(a.hashCode() == b.hashCode()); // true
请注意,建议仅将不可变对象用作HashMaps中的键:您应该至少制作name
和data
最终,并使类final
也使其真正不可变.