我很困惑,因为我认为当涉及hashCode和equals方法时,HashMap和Hashtable应该表现相同。在下面的这个例子中,我的密钥类重写了equals方法,总是返回false。
任何人都有任何想法可以解释这种行为上的差异,因为看起来两者的输出都不同
值null
值null
价值值1
价值2
import java.util.Hashtable;
import java.util.HashMap;
public class HashTest {
public static void main(String[] args) {
Hashtable ht = new Hashtable();
HashMap hm = new HashMap();
KeyClass k1 = new KeyClass("k1");
KeyClass k2 = new KeyClass("k2");
ht.put(k1, "Value 1");
ht.put(k2, "Value 2");
hm.put(k1, "Value 1");
hm.put(k2, "Value 2");
System.out.println("value " + ht.get(k1));
System.out.println("value " + ht.get(k2));
System.out.println("value " + hm.get(k1));
System.out.println("value " + hm.get(k2));
}
}
class KeyClass {
String key;
public KeyClass(String str) {
key = str;
}
@Override
public int hashCode() {
return 2;
}
@Override
public boolean equals(Object obj) {
return false;
}
}
答案 0 :(得分:7)
这是因为HashMap
首先在等式检查中使用==
:
public V get(Object key) {
//...
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
因此,尽管equals()
返回false,但同一个对象被视为相同的密钥。
答案 1 :(得分:0)
在平等中返回总是错误不是一个好主意。根据定义,equals应该是反身的:
它是自反的:对于任何非空引用值x,x.equals(x) 应该回归真实。
对于哈希表将返回null,因为它在哈希码相等时使用equals而哈希映射将首先检查==对于对象