【发布时间】:2019-09-28 07:15:49
【问题描述】:
如果你看这个程序,在 Location 类中,我们覆盖了两个方法(equals 和 hashcode),分别返回 false 和 110。我们正在创建 Location 类的一个实例并两次放入 map。当我们从 equals 方法返回 false 时,为什么 map 用 key 覆盖最后一个值?
class Location {
long latitude;
long longitude;
public Location(long latitude,int longitude) {
this.latitude = latitude;
this.longitude = longitude;
}
@Override
public boolean equals(Object obj) {
return false;
}
@Override
public int hashCode() {
return 110;
}
@Override
public String toString() {
return String.format("Latitude := %d , Longitude :=%d ", latitude,longitude);
}
}
Map<Location, String> locations = new HashMap<>();
Location l1 = new Location(2,3);
locations.put(l1, "Mumbai");
locations.put(l1,"Pune");
System.out.println(locations+ " with size of :"+locations.size());
【问题讨论】:
-
为什么 map 用 key 覆盖最后一个值?是什么意思??
-
我猜 HashMap 在调用 equals 之前比较相等 (
==) 作为优化。请注意,您的 equals 方法违反了 Object.equals 的合同,这需要自反性。 -
快速浏览
HashMapsource(从第611行开始),将引导您到第634行和((k = p.key) == key,即true。 -
HashMap依赖于equals和hashCode的正确实现。否则无法保证行为。 -
@ElliottFrisch 请注意you can do this
标签: java