在java中,equals和hashcode是有設計要求的,equals相等,則hashcode一定相等,反之則不然。
為何會有這樣的要求?
在集合中,比如HashSet中,要求放入的對象不能重復,怎么判定呢?
首先會調用hashcode,如果hashcode相等,則繼續調用equals,也相等,則認為重復。
如果重寫equals后,如果不重寫hashcode,則hashcode就是繼承自Object的,返回內存編碼,這時候可能出現equals相等,而hashcode不等,你的對象使用集合時,就會等不到正確的結果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
V put(K key, V value) {
if
(key ==
null
)
return
putForNullKey(value);
int
hash = hash(key.hashCode());
int
i = indexFor(hash, table.length);
for
(Entry<K,V> e = table[i]; e !=
null
; e = e.next) {
Object k;
if
(e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(
this
);
return
oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return
null
;
}
|