这是我们将用来放入 hasmap 的类。它已经覆盖了equals()
和hashcode()
方法。
class Dog
{
public String name;
public Dog(String n)
{
name=n;
}
@Override
public int hashCode() {
System.out.println("in hashcode");
return name.length();
}
@Override
public boolean equals(Object obj) {
System.out.println("in equals");
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Dog other = (Dog) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
这段代码在 main
Map<Object,Object> m=new HashMap<Object,Object>();
Dog d1=new Dog("clover");
m.put(d1,"Dog Key");
System.out.println(m.get(d1));
生产
in hashcode
in hashcode
Dog Key
但是下面的代码
Map<Object,Object> m=new HashMap<Object,Object>();
Dog d1=new Dog("clover");
m.put(d1,"Dog Key");
System.out.println(m.get(new Dog("clover")));
生产
in hashcode
in hashcode
in equals
Dog Key
如您所见,equals()
在第二个输出中有对方法的调用。为什么呢?
我的第二个问题
如果我更改键 Map m=new HashMap(); 的名称属性
Dog d1=new Dog("clover");
m.put(d1,"Dog Key");
d1.name="arthur";
System.out.println(m.get(new Dog("clover")));
o/p 是
in hashcode
in hashcode
in equals
null
即使我更改了键值,但我试图通过提供相同的键来检索该值。那为什么它检索null?