我已经检查了源代码:
public boolean containsKey(Object key) {
Iterator<Map.Entry<K,V>> i = entrySet().iterator();
if (key==null) {
while (i.hasNext()) {
Entry<K,V> e = i.next();
if (e.getKey()==null)
return true;
}
} else {
while (i.hasNext()) {
Entry<K,V> e = i.next();
if (key.equals(e.getKey()))
return true;
}
}
return false;
}
public boolean equals(Object obj) {
return (this == obj);
}
从源代码来看,它只显示调用了"equal()"方法,所以如果我想在map中放置一个自定义对象,我只能覆盖"equal()"方法。 所以我做了一个实验,结果是阴性的... 我必须覆盖"equals()"和"hashCode()"。所以我的问题是:
- 为什么两个方法(equals() ,hashCode())都必须被覆盖。 "
- =="操作是否在内部调用"hashCode()"方法?
AbstractMap
的实现。 HashMap
覆盖它,按如下方式实现它:
public boolean containsKey(Object key) {
return getEntry(key) != null;
}
final Entry<K,V> getEntry(Object key) {
if (size == 0) {
return null;
}
int hash = (key == null) ? 0 : hash(key);
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 != null && key.equals(k))))
return e;
}
return null;
}
final int hash(Object k) {
int h = hashSeed;
if (0 != h && k instanceof String) {
return sun.misc.Hashing.stringHash32((String) k);
}
h ^= k.hashCode();
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
如您所见,这取决于 hashCode()
.其他映射类型可能确实不依赖于重写此方法。
-
来自 Object.equals API:每当此方法被覆盖时,通常需要重写 hashCode 方法,以便维护 hashCode 方法的一般约定,该约定声明相等的对象必须具有相等的哈希代码。您可以在"Effective Java"中找到更详细的解释 第 9 项:当您覆盖等于时始终覆盖哈希代码。
不,它 没有,它只是指针比较,就像比较两个整数一样