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...