摘要:在這些類當中有其自身的實現一般都是用來比較對象的成員變量值是否相同,而不再是比較類在堆內存中的存放地址了。舉例說明結果說明中有其自身的實現,屬于內容比較。
在研究hashcode的用法,發現自己對equals的理解還不夠深,廢話少說,繼續專研,記錄如下:
要想搞清楚equals和==的區別,就先要搞清楚JAVA的數據類型:
java的數據類型只要分兩大類:
基本數據類型
引用數據類型
== 比較的是什么?基本數據類型(也稱原始數據類型) :byte,short,char,int,long,float,double,boolean。他們之間的比較,應用雙等號(==),比較的是他們的值。
引用數據類型:當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址(確切的說,是堆內存地址)。
equals比較的是什么JAVA當中所有的類都是繼承于Object這個超類的,在Object類中定義了一個equals的方法,equals的源碼是這樣寫的:
public boolean equals(Object obj) { //this - s1 //obj - s2 return (this == obj); }
可以看到,這個方法的初始默認行為是比較對象的內存地址值,一般來說,意義不大。所以,在一些類庫當中這個方法被重寫了,如String、Integer、Date。在這些類當中equals有其自身的實現(一般都是用來比較對象的成員變量值是否相同),而不再是比較類在堆內存中的存放地址了。
所以說,對于復合數據類型之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是內存中的存放位置的地址值,跟雙等號(==)的結果相同;如果被復寫,按照復寫的要求來。
@Test void Test(){ String str1 = new String("Hello"); String str2 = new String("Hello"); System.out.println(str.equals(str1)); }
結果:
true
說明String中equals有其自身的實現,屬于內容比較。
@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 這個好理解,因為str3和str4內存地址不一樣
那么str1==str2為什么是true呢?
根據說上文分析,string類不屬于非基本數據類型,這說明str1 和str2 的地址相同,str1 和str2 的地址為什么會相同?
查閱資料,發現 :
String str1 = "Hello";
這種方式,java首先會在緩沖區查找是否有"Hello"這個常量對象,有就直接將其地址賦給s1,沒有就創建一個"Hello",然后將其賦給s1;然后
String str2 = "Hello";
java同樣會在緩沖區中查找"Hello",這次能查找到了,因為s1創建了一個"Hello",所以會將其地址賦給s2,如此,str1和str2便有了相同的地址。
參考文章:https://www.cnblogs.com/smyhv...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76964.html
摘要:可實現單例模式代碼塊初始化靜態變量,只被執行一次內部類不能與外部類重名,只能訪問外部類靜態數據包括私有多分支選擇整型或字符類型變量或整數表達式開始支持。 前言 大學期間接觸 Java 的時間也不短了,不論學習還是實習,都讓我發覺基礎的重要性。互聯網發展太快了,各種框架各種技術更新迭代的速度非常快,可能你剛好掌握了一門技術的應用,它卻已經走在淘汰的邊緣了。 而學習新技術總要付出一定的時間...
摘要:面向對象與面向過程的區別要知道,二者并不是非此即彼,而是相輔相成的。而面向過程,則在微觀上對對象內部進行具體的實現。面向對象的三大特性說到面向對象,就不得不說其三大特性封裝繼承和多態。封裝封裝是面向對象最基礎的特性。 作者:伯特出處:github.com/ruicbAndroid/LoulanPlan聲明:本文出自伯特的《LoulanPlan》,轉載務必注明作者及出處。 剛學習 Jav...
摘要:作用域分類作用域共有兩種主要的工作模型。換句話說,作用域鏈是基于調用棧的,而不是代碼中的作用域嵌套。詞法作用域詞法作用域中,又可分為全局作用域,函數作用域和塊級作用域。 一篇鞏固基礎的文章,也可能是一系列的文章,梳理知識的遺漏點,同時也探究很多理所當然的事情背后的原理。 為什么探究基礎?因為你不去面試你就不知道基礎有多重要,或者是說當你的工作經歷沒有亮點的時候,基礎就是檢驗你好壞的一項...
摘要:今天總結下與網絡相關的知識,不是那么詳細,但是包含了我認為重要的所有點。概要網絡知識我做了個方面的總結,包括協議,協議,協議,協議,協議,,攻擊,其他協議。跨域名如今被普遍用在網絡中,例如等。擁塞窗口的大小又取決于網絡的擁塞狀況。 前言 無論是 C/S 開發還是 B/S 開發,無論是前端開發還是后臺開發,網絡總是無法避免的,數據如何傳輸,如何保證正確性和可靠性,如何提高傳輸效率,如何解...
閱讀 1084·2021-10-08 10:04
閱讀 3523·2021-08-05 10:01
閱讀 2278·2019-08-30 11:04
閱讀 1794·2019-08-29 15:29
閱讀 836·2019-08-29 15:12
閱讀 1670·2019-08-26 12:11
閱讀 3115·2019-08-26 11:33
閱讀 1163·2019-08-26 10:23