我最近参加了一次采访,并被问到以下问题。
有两个具有相同哈希码的对象。我在hashmap中插入这两个对象。
hMap.put(a,a);
hMap.put(b,b);
其中a.hashCode()==b.hashCode()
现在告诉我hashmap里面有多少个对象?
我回答说只有一个对象,因为哈希码相等,两个对象相等,而hashmap不允许重复键。请告诉我,我的理解是否正确?
答案 0 :(得分:32)
可以有两个具有相同哈希码的不同元素。所以你的答案是错误的。唯一保证的是,如果两个元素具有不同的哈希码,那么它们就是不同的。当两个元素具有相同的哈希码时,Java使用等于进一步的差异。
所以答案是一两个对象。
答案 1 :(得分:3)
hashmap中将有一个或两个对象。
如果两个对象不相等,即!a.equals(b)
,则两者都将被存储。
答案 2 :(得分:2)
不,hashCode是效率的初始查找,但除非a.equals(b)==true
将有两个条目
答案 3 :(得分:1)
hashmap中将有两个对象,因为它们不是equals()
。
以下是证据:
public static void main(String[] args) {
Object a = new Object() {
public int hashCode() {
return 1;
}
};
Object b = new Object() {
public int hashCode() {
return 1;
}
};
Map<Object, Object> map = new HashMap<Object, Object>();
map.put(a, a);
map.put(b, b);
System.out.println(map.size());
}
输出:
2
如果我添加这样的equals()方法:
public boolean equals(Object obj) {
return obj.hashCode() == hashCode();
}
输出:
1
根据Object.equals()的javadoc:
请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相同的哈希代码。
这 not 但是意味着两个不是equals()
的对象不能共享相同的哈希码。
答案 4 :(得分:0)
根据a.equals(b),有一个或两个关键对象,以及一个或两个值对象,具体取决于== b。