==的分析
1、對(duì)於基本資料類型,比較的是他們的具體內(nèi)容是不是一樣,跟他們的內(nèi)存地址無關(guān)。
舉例:
public class Test{ public static void main(String[] args) { int i = 10; double j = 10.0; float m = 10.0f; char k = 10; boolean b = true; System.out.println(i == j); System.out.println(i == m); System.out.println(m == k); System.out.println("*******************"); //System.out.println(i == b); 很明顯,布爾型不能和其他基本數(shù)據(jù)類型比較,編譯報(bào)錯(cuò). System.out.println(System.identityHashCode(i)); System.out.println(System.identityHashCode(j)); System.out.println(System.identityHashCode(m)); System.out.println(System.identityHashCode(k)); System.out.println(System.identityHashCode(b)); } }
輸出:
true true true ******************* 366712642 1829164700 2018699554 1311053135 118352462
相關(guān)影片教學(xué)推薦:java免費(fèi)影片教學(xué)
分析:
①根據(jù)比較的結(jié)果和記憶體位址來看,內(nèi)容一樣,記憶體位址不一樣,但回傳的結(jié)果都是true,說明比較的時(shí)候只看變數(shù)中儲(chǔ)存的內(nèi)容是否相同,而跟記憶體位址無關(guān)。
②==比較的兩邊資料需要能強(qiáng)制轉(zhuǎn)換成同一型,例如int和double的比較,會(huì)強(qiáng)制轉(zhuǎn)換到double。
③布林類型不能和int,float,double,char等基本資料型別做比較,編譯就報(bào)錯(cuò)。
2、對(duì)於引用資料型別的比較:
public class Test{ public static void main(String[] args) { Test t1 = new Test(); Test t2 = new Test(); String name1 = "瓊寶"; String name2 = "瓊寶"; System.out.println(name1 == name2); // true System.out.println(System.identityHashCode(name1)); //366712642 System.out.println(System.identityHashCode(name2)); //366712642 System.out.println(t1 == t2); //false System.out.println(System.identityHashCode(t1)); //366712642 System.out.println(System.identityHashCode(t2)); //1829164700 System.out.println(System.identityHashCode(new Test())); //2018699554 System.out.println(System.identityHashCode(new Test())); //1311053135 System.out.println(new Test() == new Test()); } }
#輸出:
true 366712642 366712642 false 366712642 1829164700 2018699554 1311053135 false
分析:
①對(duì)於引用資料型,此時(shí)牽涉到兩塊記憶體的問題, 而且比較的也是記憶體位址是否相同,例如執(zhí)行語句:
Test t1 = new Test() Test t2 = new Test()
時(shí),會(huì)開闢兩塊內(nèi)存,一塊用於儲(chǔ)存t1 t2 ,一塊用於儲(chǔ)存兩個(gè)new Test()。而很明顯的是,t1和t2的記憶體位址不一樣,就連兩個(gè)new Test()的位址都不一樣,所以此時(shí)用==來比較的時(shí)候,結(jié)果必然是false.
(補(bǔ)充:t1和t2中儲(chǔ)存的其實(shí)是new Test() 物件使用的記憶體的首地址。)
②對(duì)於String類型來說,內(nèi)容相同的時(shí)候,其記憶體位址也相同,比較的時(shí)候看的也是位址。
如果要比較物件中儲(chǔ)存的內(nèi)容是否相同(不是比較位址),那麼==就無法實(shí)現(xiàn),此時(shí)需要equals。
equals的分析
1、先看一個(gè)equals比較的例子:
public class TestEquals { public static void main(String[] args) { TestEquals t1 = new TestEquals(); TestEquals t2 = new TestEquals(); System.out.println(t1.equals(t2)); //false String s1 = new String(); String s2 = new String(); System.out.println(System.identityHashCode(s1)); System.out.println(System.identityHashCode(s2)); System.out.println(System.identityHashCode(new String())); System.out.println(System.identityHashCode(new String())); System.out.println(s1.equals(s2)); // true } } 輸出結(jié)果: false 366712642 1829164700 2018699554 1311053135 true
2、分析:
①t1和t2的比較是false,而s1和s2的比較是true,這裡就牽涉到了equals方法的重寫問題,先看Object類別中equals的源碼:
public boolean equals(Object obj) { return (this == obj); }
?② 對(duì)於s1.equals(s2) ,this就是s1,obj是s2,而源碼中的比較用的是==,很明顯是引用資料型態(tài)的比較,看的是s1和s2的記憶體位址,上面的分析已經(jīng)知道他們的位址不一樣,所以結(jié)果自然就是false.
③而s1和s2的比較結(jié)果是true,這是因?yàn)樵赟tring類別中,equals方法被重寫了,看源碼:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
④通過和object中equals原始碼的比較可以看出,String中的equals方法比較的不再是物件的位址,而是看兩個(gè)物件內(nèi)容,或是兩個(gè)物件的屬性是否都一樣。
⑤像String,Date,F(xiàn)ile…等類別都對(duì)equals方法進(jìn)行了重寫。
總結(jié):
1.==用於比較基本資料型別時(shí),比較的是內(nèi)容是否相等,比較引用資料型別時(shí),看的是記憶體位址是否相等。
2.equals只能比較引用資料型別(物件),沒被重寫之前,使用==來比較記憶體位址,重寫後比較的是物件的具 體內(nèi)容和屬性是否一致。
更多相關(guān)文章教學(xué)請(qǐng)?jiān)煸L:java程式設(shè)計(jì)入門
#以上是java中關(guān)於==和equals的分析的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

要正確處理JDBC事務(wù),必須先關(guān)閉自動(dòng)提交模式,再執(zhí)行多個(gè)操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個(gè)SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時(shí)應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時(shí)間;3.使用of()方法創(chuàng)建特定日期時(shí)間;4.利用plus/minus方法不可變地增減時(shí)間;5.使用ZonedDateTime和ZoneId處理時(shí)區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時(shí)通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

Java的垃圾回收(GC)是自動(dòng)管理內(nèi)存的機(jī)制,通過回收不可達(dá)對(duì)象釋放堆內(nèi)存,減少內(nèi)存洩漏風(fēng)險(xiǎn)。 1.GC從根對(duì)象(如棧變量、活動(dòng)線程、靜態(tài)字段等)出發(fā)判斷對(duì)象可達(dá)性,無法到達(dá)的對(duì)像被標(biāo)記為垃圾。 2.基於標(biāo)記-清除算法,標(biāo)記所有可達(dá)對(duì)象,清除未標(biāo)記對(duì)象。 3.採用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時(shí)較長的MajorGC;Metaspace存儲(chǔ)類元數(shù)據(jù)。 4.JVM提供多種GC器:SerialGC適用於小型應(yīng)用;ParallelGC提升吞吐量;CMS降

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

defer用於在函數(shù)返回前執(zhí)行指定操作,如清理資源;參數(shù)在defer時(shí)立即求值,函數(shù)按後進(jìn)先出(LIFO)順序執(zhí)行;1.多個(gè)defer按聲明逆序執(zhí)行;2.常用於文件關(guān)閉等安全清理;3.可修改命名返回值;4.即使發(fā)生panic也會(huì)執(zhí)行,適合用於recover;5.避免在循環(huán)中濫用defer,防止資源洩漏;正確使用可提升代碼安全性和可讀性。

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac
