我弄乱了一些哈希代码+等于+地图的东西,发现了一些东西......奇怪。
代码段如下:
class Obj {
String n;
Obj(String n) {this.n = n;}
public int hashCode() {return 0;}
public boolean equals(Object o) {return false;} // no instance of this class
// equals any other instance
}
然后我做了这样的事情:
java.util.Map<Obj,String> map = new java.util.HashMap<Obj,String>();
Obj o1 = new Obj("1");
Obj o11 = new Obj("1");
Obj o2 = new Obj("2");
map.put(o1,"val 1");
map.put(o11,"val 2");
map.put(o2,"val 3");
p("size = " + map.size()); // obviously 3
p(map.get(new Obj("1"))); // obviously null
p(map.get(o1)); // ...
最后一行是奇怪的部分。最后一行返回val 1
。怎么来了?equals
方法始终返回 false
。这是因为在调用 ==
运算符之前使用了equals
吗?
感谢您的任何见解。
在 HashMap.java 中,get
方法是:
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
行确实在调用equals
之前使用 ==
比较键。 这就是为什么你试图消除平等的尝试失败了。
哈希映射实现检查键的 == 和相等。(如果哈希代码相同)
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashMap.java#HashMap.get%28java.lang.Object%29