1. 程式人生 > >equals和hashcode的聯系

equals和hashcode的聯系

算法 判斷 hashcode == return lse als 是否 obj

obj中的equals方法,默認比較的是內存地址;
public boolean equals(Object obj) {
return (this == obj);
}
hashcode 方法是native的,在c++中實現的;

如果重寫,java對象的equals和hashcode是這樣規定的:
1.相等的對象必須具有相同的hashcode值;
  如果兩個java對象A和B,A和B的euqals結果為true,hashmap的put方法是pus時流程如下:
    hash(key)得到key的hashcode(),hashmap根據獲得的hashcode找到要插入的位置所在的鏈,
    在這個鏈裏面放的都是hashcode相同的Entry鍵值對,在找到這個鏈之後,會通過equals()方法判斷是否已經存在要插入的鍵值對。
  如果第一步hashcode值已經不同了,那麽就會重復插入兩個key,違反了hashmap的原則。
2.hashcode相同,對象不一定相同;
  假如兩個Java對象A和B,A和B不相等(eqauls結果為false),但A和B的哈希碼相等,將A和B都存入HashMap時會發生哈希沖突,
  也就是A和B存放在HashMap內部數組的位置索引相同這時HashMap會在該位置建立一個鏈接表,將A和B串起來放在該位置,顯然,
  該情況不違反HashMap的使用原則,是允許的。當然,哈希沖突越少越好,盡量采用好的哈希算法以避免哈希沖突。





equals和hashcode的聯系