日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java虚拟机如何判断两个类相同_你有没有想过: Java 虚拟机是如何判断两个对象是否相同的?判断的流程是什么?...

發(fā)布時間:2025/3/19 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java虚拟机如何判断两个类相同_你有没有想过: Java 虚拟机是如何判断两个对象是否相同的?判断的流程是什么?... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在Java程序運行時,會產(chǎn)生那么多的對象,那 Java 虛擬機是如何判斷兩個對象是否相同的呢?判斷的流程是什么?

參考解答:

Java 虛擬機會先判斷兩個對象的hashCode是否相同,如果hashCode不同,則說明肯定是兩個不同的對象了;如果hashCode相同再通過equals()方法進行進一步比較,如果equals方法返回true,則說明兩個對象是相同的,如果equals方法返回false說明兩個對象不同。

如何驗證

怎么來驗證這個問題呢?我們知道HashSet是不允許存儲相同的鍵值的。所以我們可以用HashSet存儲兩個相同的鍵值來模擬,看Java虛擬機是如何做判斷和識別的,從而驗證我們的猜想。

// 先自定義一個類并復寫 hashCode 和 equals 方法

public class CustomClass {

@Override

public int hashCode() {

System.out.println("判斷 hashCode");

return 1; // 返回1,說明所有新建的對象的哈希值都為1,也就是相同

}

@Override

public boolean equals(Object o) {

System.out.println("判斷 equals");

return true; // 返回true

}

}

接下來我們用HashSet來存儲兩個自定義的CustomClass的對象,代碼如下:

public class HashSetTest {

public static void main(String[] args) {

HashSet 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集合看里面存放了什么

}

}

打印結(jié)果如下:

判斷 hashCode

判斷 hashCode

判斷 equals

----hs添加完畢

判斷 hashCode // 此處的判斷是打印輸出語句執(zhí)行時調(diào)用的,與分析本問題無關(guān)

hs:[com.alankeene.javalib.collections.CustomClass@1]

結(jié)果分析:

執(zhí)行 hs.add(cs1) 語句的時候,Java 虛擬機會先判斷 cs1 所指向?qū)ο蟮膆ashCode,因為是第一次往HashSet集合里面存放元素,該元素 hashCode 在集合中肯定是還沒存在的,這是個新的元素,所以直接存放進集合中,不用調(diào)用 cs1 所指向?qū)ο蟮?equals 方法。

當執(zhí)行 hs.add(cs2) 語句時,這是第二次往集合里存放元素,有新的元素 cs2 要添加進來,那先要調(diào)用 cs2 所指向?qū)ο蟮?hashCode 方法看看它的哈希值是不是與集合中已有元素的哈希值重復了,發(fā)現(xiàn)重復了,哈希值都是1,那有可能是同一個對象,那就要調(diào)用 cs2 所指向?qū)ο蟮?equals 方法做進一步判斷,發(fā)現(xiàn) equals 方法返回 true,則判斷為是重復的元素,就不往集合里添加了。

所以最終打印 HashSet 集合的時候可以看到,集合中只存放了一個元素。

我們再反證一下,把 equals 方法改為返回 false,模擬兩個hashCode相同,但是是兩個不同的對象的情景。

public class CustomClass {

@Override

public int hashCode() {

System.out.println("判斷 hashCode");

return 1; // 返回1,說明所有新建的對象的哈希值都為1,也就是相同

}

@Override

public boolean equals(Object o) {

System.out.println("判斷 equals");

return false; // 返回false

}

}

打印結(jié)果會如下:

判斷 hashCode

判斷 hashCode

判斷 equals

----hs添加完畢

判斷 hashCode // 此處的判斷是打印輸出語句執(zhí)行時調(diào)用的,與分析本問題無關(guān)

判斷 hashCode // 此處的判斷是打印輸出語句執(zhí)行時調(diào)用的,與分析本問題無關(guān)

hs:[com.alankeene.javalib.collections.CustomClass@1, com.alankeene.javalib.collections.CustomClass@1]

會發(fā)現(xiàn),HashSet集合中存放了兩個元素了,說明雖然 cs1 和 cs2 的哈希值相同,但是虛擬機判斷為不同的元素并存入集合中了。

由此,驗證了我們的猜想。Java 虛擬機是先判斷 hashCode,如果 hashCode 相同再通過 equals 去判斷兩個對象是否相同的。

總結(jié)

以上是生活随笔為你收集整理的java虚拟机如何判断两个类相同_你有没有想过: Java 虚拟机是如何判断两个对象是否相同的?判断的流程是什么?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。