java虚拟机如何判断两个类相同_你有没有想过: Java 虚拟机是如何判断两个对象是否相同的?判断的流程是什么?...
在Java程序運(yùn)行時(shí),會(huì)產(chǎn)生那么多的對(duì)象,那 Java 虛擬機(jī)是如何判斷兩個(gè)對(duì)象是否相同的呢?判斷的流程是什么?
參考解答:
Java 虛擬機(jī)會(huì)先判斷兩個(gè)對(duì)象的hashCode是否相同,如果hashCode不同,則說(shuō)明肯定是兩個(gè)不同的對(duì)象了;如果hashCode相同再通過(guò)equals()方法進(jìn)行進(jìn)一步比較,如果equals方法返回true,則說(shuō)明兩個(gè)對(duì)象是相同的,如果equals方法返回false說(shuō)明兩個(gè)對(duì)象不同。
如何驗(yàn)證
怎么來(lái)驗(yàn)證這個(gè)問(wèn)題呢?我們知道HashSet是不允許存儲(chǔ)相同的鍵值的。所以我們可以用HashSet存儲(chǔ)兩個(gè)相同的鍵值來(lái)模擬,看Java虛擬機(jī)是如何做判斷和識(shí)別的,從而驗(yàn)證我們的猜想。
// 先自定義一個(gè)類并復(fù)寫(xiě) hashCode 和 equals 方法
public class CustomClass {
@Override
public int hashCode() {
System.out.println("判斷 hashCode");
return 1; // 返回1,說(shuō)明所有新建的對(duì)象的哈希值都為1,也就是相同
}
@Override
public boolean equals(Object o) {
System.out.println("判斷 equals");
return true; // 返回true
}
}
接下來(lái)我們用HashSet來(lái)存儲(chǔ)兩個(gè)自定義的CustomClass的對(duì)象,代碼如下:
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 // 此處的判斷是打印輸出語(yǔ)句執(zhí)行時(shí)調(diào)用的,與分析本問(wèn)題無(wú)關(guān)
hs:[com.alankeene.javalib.collections.CustomClass@1]
結(jié)果分析:
執(zhí)行 hs.add(cs1) 語(yǔ)句的時(shí)候,Java 虛擬機(jī)會(huì)先判斷 cs1 所指向?qū)ο蟮膆ashCode,因?yàn)槭堑谝淮瓮鵋ashSet集合里面存放元素,該元素 hashCode 在集合中肯定是還沒(méi)存在的,這是個(gè)新的元素,所以直接存放進(jìn)集合中,不用調(diào)用 cs1 所指向?qū)ο蟮?equals 方法。
當(dāng)執(zhí)行 hs.add(cs2) 語(yǔ)句時(shí),這是第二次往集合里存放元素,有新的元素 cs2 要添加進(jìn)來(lái),那先要調(diào)用 cs2 所指向?qū)ο蟮?hashCode 方法看看它的哈希值是不是與集合中已有元素的哈希值重復(fù)了,發(fā)現(xiàn)重復(fù)了,哈希值都是1,那有可能是同一個(gè)對(duì)象,那就要調(diào)用 cs2 所指向?qū)ο蟮?equals 方法做進(jìn)一步判斷,發(fā)現(xiàn) equals 方法返回 true,則判斷為是重復(fù)的元素,就不往集合里添加了。
所以最終打印 HashSet 集合的時(shí)候可以看到,集合中只存放了一個(gè)元素。
我們?cè)俜醋C一下,把 equals 方法改為返回 false,模擬兩個(gè)hashCode相同,但是是兩個(gè)不同的對(duì)象的情景。
public class CustomClass {
@Override
public int hashCode() {
System.out.println("判斷 hashCode");
return 1; // 返回1,說(shuō)明所有新建的對(duì)象的哈希值都為1,也就是相同
}
@Override
public boolean equals(Object o) {
System.out.println("判斷 equals");
return false; // 返回false
}
}
打印結(jié)果會(huì)如下:
判斷 hashCode
判斷 hashCode
判斷 equals
----hs添加完畢
判斷 hashCode // 此處的判斷是打印輸出語(yǔ)句執(zhí)行時(shí)調(diào)用的,與分析本問(wèn)題無(wú)關(guān)
判斷 hashCode // 此處的判斷是打印輸出語(yǔ)句執(zhí)行時(shí)調(diào)用的,與分析本問(wèn)題無(wú)關(guān)
hs:[com.alankeene.javalib.collections.CustomClass@1, com.alankeene.javalib.collections.CustomClass@1]
會(huì)發(fā)現(xiàn),HashSet集合中存放了兩個(gè)元素了,說(shuō)明雖然 cs1 和 cs2 的哈希值相同,但是虛擬機(jī)判斷為不同的元素并存入集合中了。
由此,驗(yàn)證了我們的猜想。Java 虛擬機(jī)是先判斷 hashCode,如果 hashCode 相同再通過(guò) equals 去判斷兩個(gè)對(duì)象是否相同的。
總結(jié)
以上是生活随笔為你收集整理的java虚拟机如何判断两个类相同_你有没有想过: Java 虚拟机是如何判断两个对象是否相同的?判断的流程是什么?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java函數_函數(Java版)
- 下一篇: Java txt 下拉刷新_手写上拉加载