JDK 是如何判断两个对象是否相同的?判断的流程是什么?
JDK 是如何判斷兩個對象是否相同的呢?判斷的流程是什么?
參考解答:
JDK 會先判斷兩個對象的hashCode是否相同,如果hashCode不同,則說明肯定是兩個不同的對象了;如果hashCode相同再通過equals()方法進行進一步比較,如果equals方法返回true,則說明兩個對象是相同的,如果equals方法返回false說明兩個對象不同。
如何驗證
怎么來驗證這個問題呢?我們知道HashSet是不允許存儲相同的鍵值的。所以我們可以用HashSet存儲兩個相同的鍵值來模擬,看JDK是如何做判斷和識別的,從而驗證我們的猜想。
// 先自定義一個類并復寫 hashCode 和 equals 方法public class CustomClass {@Overridepublic int hashCode() {System.out.println("判斷 hashCode");return 1; // 返回1,說明所有新建的對象的哈希值都為1,也就是相同}@Overridepublic boolean equals(Object o) {System.out.println("判斷 equals");return true; // 返回true} }接下來我們用HashSet來存儲兩個自定義的CustomClass的對象,代碼如下:
public class HashSetTest {public static void main(String[] args) {HashSet<CustomClass> hs = new HashSet<>();CustomClass cs1 = new CustomClass();CustomClass cs2 = new CustomClass();hs.add(cs1);hs.add(cs2);System.out.println("----hs添加完畢");System.out.println("hs:"+hs); // 打印一下hashSet集合看里面存放了什么} }打印結果如下:
判斷 hashCode 判斷 hashCode 判斷 equals ----hs添加完畢 判斷 hashCode // 此處的判斷是打印輸出語句執行時調用的,與分析本問題無關 hs:[com.alankeene.javalib.collections.CustomClass@1]結果分析:
執行 hs.add(cs1) 語句的時候,JDK 會先判斷 cs1 所指向對象的hashCode,因為是第一次往HashSet集合里面存放元素,該元素 hashCode 在集合中肯定是還沒存在的,這是個新的元素,所以直接存放進集合中,不用調用 cs1 所指向對象的 equals 方法。
當執行 hs.add(cs2) 語句時,這是第二次往集合里存放元素,有新的元素 cs2 要添加進來,那先要調用 cs2 所指向對象的 hashCode 方法看看它的哈希值是不是與集合中已有元素的哈希值重復了,發現重復了,哈希值都是1,那有可能是同一個對象,那就要調用 cs2 所指向對象的 equals 方法做進一步判斷,發現 equals 方法返回 true,則判斷為是重復的元素,就不往集合里添加了。
所以最終打印 HashSet 集合的時候可以看到,集合中只存放了一個元素。
注:所以平時我們在自定義一個類時,要謹慎把 equals 方法的返回值靜態的設置為 true,因為一旦產生哈希沖突,JDK 就會認為相同哈希值的對象就是同一個對象了。我們再反證一下,把 equals 方法改為返回 false,模擬兩個hashCode相同,但是是兩個不同的對象的情景。
public class CustomClass {@Overridepublic int hashCode() {System.out.println("判斷 hashCode");return 1; // 返回1,說明所有新建的對象的哈希值都為1,也就是相同}@Overridepublic boolean equals(Object o) {System.out.println("判斷 equals");return false; // 返回false} }打印結果會如下:
判斷 hashCode 判斷 hashCode 判斷 equals ----hs添加完畢 判斷 hashCode // 此處的判斷是打印輸出語句執行時調用的,與分析本問題無關 判斷 hashCode // 此處的判斷是打印輸出語句執行時調用的,與分析本問題無關 hs:[com.alankeene.javalib.collections.CustomClass@1, com.alankeene.javalib.collections.CustomClass@1]會發現,HashSet集合中存放了兩個元素了,說明雖然 cs1 和 cs2 的哈希值相同,但是 JDK 判斷為不同的元素并存入集合中了。
由此,驗證了我們的猜想。JDK 是先判斷 hashCode,如果 hashCode 相同再通過 equals 去判斷兩個對象是否相同的。
總結
以上是生活随笔為你收集整理的JDK 是如何判断两个对象是否相同的?判断的流程是什么?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一段话系列-领域模型是什么?
- 下一篇: Android隐藏EditText长按菜