摘要:在這些類當(dāng)中有其自身的實(shí)現(xiàn)一般都是用來比較對象的成員變量值是否相同,而不再是比較類在堆內(nèi)存中的存放地址了。舉例說明結(jié)果說明中有其自身的實(shí)現(xiàn),屬于內(nèi)容比較。
在研究hashcode的用法,發(fā)現(xiàn)自己對equals的理解還不夠深,廢話少說,繼續(xù)專研,記錄如下:
要想搞清楚equals和==的區(qū)別,就先要搞清楚JAVA的數(shù)據(jù)類型:
java的數(shù)據(jù)類型只要分兩大類:
基本數(shù)據(jù)類型
引用數(shù)據(jù)類型
== 比較的是什么?基本數(shù)據(jù)類型(也稱原始數(shù)據(jù)類型) :byte,short,char,int,long,float,double,boolean。他們之間的比較,應(yīng)用雙等號(==),比較的是他們的值。
引用數(shù)據(jù)類型:當(dāng)他們用(==)進(jìn)行比較的時(shí)候,比較的是他們在內(nèi)存中的存放地址(確切的說,是堆內(nèi)存地址)。
equals比較的是什么JAVA當(dāng)中所有的類都是繼承于Object這個(gè)超類的,在Object類中定義了一個(gè)equals的方法,equals的源碼是這樣寫的:
public boolean equals(Object obj) { //this - s1 //obj - s2 return (this == obj); }
可以看到,這個(gè)方法的初始默認(rèn)行為是比較對象的內(nèi)存地址值,一般來說,意義不大。所以,在一些類庫當(dāng)中這個(gè)方法被重寫了,如String、Integer、Date。在這些類當(dāng)中equals有其自身的實(shí)現(xiàn)(一般都是用來比較對象的成員變量值是否相同),而不再是比較類在堆內(nèi)存中的存放地址了。
所以說,對于復(fù)合數(shù)據(jù)類型之間進(jìn)行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是內(nèi)存中的存放位置的地址值,跟雙等號(==)的結(jié)果相同;如果被復(fù)寫,按照復(fù)寫的要求來。
@Test void Test(){ String str1 = new String("Hello"); String str2 = new String("Hello"); System.out.println(str.equals(str1)); }
結(jié)果:
true
說明String中equals有其自身的實(shí)現(xiàn),屬于內(nèi)容比較。
@Test public void TestString(){ String str1 = "Hello"; String str2 = "Hello"; System.out.println(str1 == str2); String str3 = new String("Hello"); String str4= new String("Hello"); System.out.println(str3 == str4); System.out.println(str1.equals(str2)); System.out.println(str3.equals(str4)); System.out.println(str1.equals(str3)); System.out.println(str3.equals(str1)); }
true
false
true
true
true
true
str3==str4 輸出 fasle 這個(gè)好理解,因?yàn)閟tr3和str4內(nèi)存地址不一樣
那么str1==str2為什么是true呢?
根據(jù)說上文分析,string類不屬于非基本數(shù)據(jù)類型,這說明str1 和str2 的地址相同,str1 和str2 的地址為什么會相同?
查閱資料,發(fā)現(xiàn) :
String str1 = "Hello";
這種方式,java首先會在緩沖區(qū)查找是否有"Hello"這個(gè)常量對象,有就直接將其地址賦給s1,沒有就創(chuàng)建一個(gè)"Hello",然后將其賦給s1;然后
String str2 = "Hello";
java同樣會在緩沖區(qū)中查找"Hello",這次能查找到了,因?yàn)閟1創(chuàng)建了一個(gè)"Hello",所以會將其地址賦給s2,如此,str1和str2便有了相同的地址。
參考文章:https://www.cnblogs.com/smyhv...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76964.html
摘要:可實(shí)現(xiàn)單例模式代碼塊初始化靜態(tài)變量,只被執(zhí)行一次內(nèi)部類不能與外部類重名,只能訪問外部類靜態(tài)數(shù)據(jù)包括私有多分支選擇整型或字符類型變量或整數(shù)表達(dá)式開始支持。 前言 大學(xué)期間接觸 Java 的時(shí)間也不短了,不論學(xué)習(xí)還是實(shí)習(xí),都讓我發(fā)覺基礎(chǔ)的重要性?;ヂ?lián)網(wǎng)發(fā)展太快了,各種框架各種技術(shù)更新迭代的速度非???,可能你剛好掌握了一門技術(shù)的應(yīng)用,它卻已經(jīng)走在淘汰的邊緣了。 而學(xué)習(xí)新技術(shù)總要付出一定的時(shí)間...
摘要:面向?qū)ο笈c面向過程的區(qū)別要知道,二者并不是非此即彼,而是相輔相成的。而面向過程,則在微觀上對對象內(nèi)部進(jìn)行具體的實(shí)現(xiàn)。面向?qū)ο蟮娜筇匦哉f到面向?qū)ο螅筒坏貌徽f其三大特性封裝繼承和多態(tài)。封裝封裝是面向?qū)ο笞罨A(chǔ)的特性。 作者:伯特出處:github.com/ruicbAndroid/LoulanPlan聲明:本文出自伯特的《LoulanPlan》,轉(zhuǎn)載務(wù)必注明作者及出處。 剛學(xué)習(xí) Jav...
摘要:作用域分類作用域共有兩種主要的工作模型。換句話說,作用域鏈?zhǔn)腔谡{(diào)用棧的,而不是代碼中的作用域嵌套。詞法作用域詞法作用域中,又可分為全局作用域,函數(shù)作用域和塊級作用域。 一篇鞏固基礎(chǔ)的文章,也可能是一系列的文章,梳理知識的遺漏點(diǎn),同時(shí)也探究很多理所當(dāng)然的事情背后的原理。 為什么探究基礎(chǔ)?因?yàn)槟悴蝗ッ嬖嚹憔筒恢阑A(chǔ)有多重要,或者是說當(dāng)你的工作經(jīng)歷沒有亮點(diǎn)的時(shí)候,基礎(chǔ)就是檢驗(yàn)?zāi)愫脡牡囊豁?xiàng)...
摘要:今天總結(jié)下與網(wǎng)絡(luò)相關(guān)的知識,不是那么詳細(xì),但是包含了我認(rèn)為重要的所有點(diǎn)。概要網(wǎng)絡(luò)知識我做了個(gè)方面的總結(jié),包括協(xié)議,協(xié)議,協(xié)議,協(xié)議,協(xié)議,,攻擊,其他協(xié)議??缬蛎缃癖黄毡橛迷诰W(wǎng)絡(luò)中,例如等。擁塞窗口的大小又取決于網(wǎng)絡(luò)的擁塞狀況。 前言 無論是 C/S 開發(fā)還是 B/S 開發(fā),無論是前端開發(fā)還是后臺開發(fā),網(wǎng)絡(luò)總是無法避免的,數(shù)據(jù)如何傳輸,如何保證正確性和可靠性,如何提高傳輸效率,如何解...
閱讀 1096·2021-10-08 10:04
閱讀 3536·2021-08-05 10:01
閱讀 2292·2019-08-30 11:04
閱讀 1810·2019-08-29 15:29
閱讀 862·2019-08-29 15:12
閱讀 1687·2019-08-26 12:11
閱讀 3129·2019-08-26 11:33
閱讀 1173·2019-08-26 10:23