覆蓋equals總要覆蓋hashCode

2021-09-27 06:43:15 字數 1006 閱讀 1907

1、== :通過物件位址,判斷兩個物件是否相等

public native int hashcode();
2、equals():在沒有覆蓋object的equals之前,相當於==

public boolean equals(object obj)
為什麼覆蓋equals總要覆蓋hashcode()?

1、equals應該提供的是邏輯上的相等。如:

phonenumber p1 = new phonenumber("020","1234567");

phonenumber p2 = new phonenumber("020","1234567");

p1 == p2; -> false

p1.equals(p2); -> 沒有覆蓋object的equals時 false

但是從顯示的邏輯中,p1和p2應該是相同的**號碼。equals()輸出的應該時true。所以應該在子類中覆蓋equals()方法。

2、覆蓋hashcode的乙個重要體現是在使用set、map的時候。

hashmaptest = new hashmap();

test.put(new phonenume("020","1234567"),"czc");

test.put(new phonenume("020","1234567"),"czc");

沒有覆蓋hashcode()之前,兩個new知道後的物件位址值不同

可能出現存在插入了兩個

hashmap插入的過程是,計算key的hashcode,通過hashcode確定index,衝突的時候通過equals看是否是同乙個物件(邏輯上)。

最終應該存在這樣的關係:

equals()相等的兩個物件,hashcode()的值一定相等。

hashcode()相等的兩個物件,equals不一定相等。(因為hashcode的計算方式可能不同,算出相同的值)

第9條 覆蓋equals時總要覆蓋hashCode

在每乙個覆蓋equals方法的類中,都必須覆蓋hashcode方法,如果不這麼做,會導致這個類無法結合所有基於雜湊的集合的正常使用,如hashmap,hashset,hashtable。object規範中有這麼一條 如果兩個物件根據equals object 方法比較是相等的,那麼呼叫這物件中任意乙...

覆蓋equals時遵守通用約定

類的每個例項都只與它自身相等。1,類的每個例項本質都是唯一的。2,不關心類是否提供了 邏輯相等 的測試功能。3,超類以及覆蓋了equals,從超類繼承過來的行為對於子類也是合適的。4,類是私有的或是包級私有的,可以確定它的equals方法永遠不會被呼叫。equals方法實現了等價關係 1,自反性。x...

覆蓋equals時遵守通用約定

不覆蓋equals時,類的每個例項都只與它自己相等。如果類有自己的邏輯相等概念,且超類未覆蓋equals以實現期望的行為,這時需覆蓋equals。約定內容 1.自反性 對於任何非null的引用值x,x.equals x 必須返回true 2.對稱性 對於任何非null的引用值x和y,當且僅當y.eq...