我有点困惑,因为我认为哈希图和哈希表在哈希代码和等于方法方面应该以相同的方式运行。 在下面的示例中,我的键类已覆盖等于方法以始终返回 false。
有没有人有任何想法可以解释这种行为差异,因为两者的输出似乎不同
值空
值空
值 值 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;
}
}
发生这种情况是因为HashMap
首先在相等性检查中使用==
:
public V get(Object key) {
//...
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
因此,尽管equals()
返回 false,但相同的对象被视为相同的键。
在等于中返回总是 false 不是一个好主意。根据定义,等于应该是反身的:
对于哈希它是自反的:对于任何非空引用值 x,x.equals(x) 应返回 true。
表将返回 null,因为它在哈希代码相等时使用 equal,而对于哈希映射将首先检查对象的 ==