首先我們來介紹JVM中的記憶體分配知識:
(推薦教學:java課程)
在JVM中,記憶體分為堆疊記憶體跟棧記憶體。他們二者的差別是: 當我們建立一個物件(new Object)時,就會呼叫物件的建構子來開闢空間,將物件資料儲存到堆疊記憶體中,同時在堆疊記憶體中產生對應的引用,當我們在後續程式碼中呼叫的時候用的都是棧記憶體中的參考。還需注意的一點,基本資料型別是儲存在棧記憶體中。
初步認識equals與==的區別:
==是判斷兩個變數或實例是不是指向同一個記憶體空間,equals是判斷兩個變數或實例所指向的記憶體空間的值是不是相同。 ==是指將記憶體位址進行比較,equals()是對字串的內容進行比較。 ==指引用是否相同, equals()指的是值是否相同。
用一張圖可以簡單的表現他們之間的關係:
#測試:
equals與==的區別詳解:
== 比較的是變數(堆疊)記憶體中存放的物件的(堆疊)記憶體位址,用來判斷兩個物件的位址是否相同,即是否指相同一個物件。比較的是真正意義上的指標操作。 equals用來比較的是兩個物件的內容是否相等,由於所有的類別都是繼承自java.lang.Object類別的,所以適用於所有對象,如果沒有對該方法進行覆蓋的話,調用的仍然是Object類別中的方法,而Object中的equals方法回傳的卻是==的判斷。
String s="abcd"是一種非常特殊的形式,和new 有本質的差別。它是java中唯一不需要new 就可以產生物件的途徑。以String s="abcd";形式賦值在java中叫直接量,它是在常數池中而不是像new一樣放在壓縮堆中。
這種形式的字串,在JVM內部發生字串拘留,即當聲明這樣的一個字串後,JVM會在常數池中先查找有有沒有一個值為"abcd"的對象,如果有,就會把它賦給當前引用.即原來那個引用和現在這個引用指點向了同一對象, 如果沒有,則在常數池中新創建一個"abcd",下一次如果有String s1 = " abcd";又會將s1指向"abcd"這個物件,即以這形式宣告的字串,只要值相等,任何多個引用都指向同一物件。
而String s = new String("abcd");和其它任何物件一樣.每呼叫一次就產生一個對象,只要它們呼叫。也可以這麼理解: String str = "hello"; 先在記憶體中找是不是有"hello"這個物件,如果有,就讓str指向那個"hello"。
如果記憶體裡沒有"hello",就建立一個新的物件儲存"hello". String str=new String ("hello") 就是不管記憶體裡是不是已經有"hello"這個對象,都新建一個物件保存"hello"。
測試:
相關推薦:java入門
以上是詳細講解equals與==的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!