物件比較中equals與==的區別
阿新 • • 發佈:2019-02-19
關於變數之間的比較,可以分為基礎型別變數的比較和物件之間的比較。
對於基本型別來說,他們儲存在jvm的棧中,因此比較的是變數的內容,也就是比較的變數的值。
對於引用型別來說,因為物件內容儲存在jvm的堆中,棧中只是儲存物件的引用(地址),無論是==還是equals比較的都是棧中的內容,即物件的引用,也就是比較的是兩個物件的地址。但根據建立物件的方式不同可以分為兩種情況:
1. 使用表示式建立物件:
2.使用new方法建立物件:
這裡會引入兩個新的問題:
1.為什麼表示式建立和new建立,會讓==比較產生不同的結果。
這是因為jvm在程式執行的時候會建立一個緩衝池,當使用表示式建立的時候,程式會在緩衝池中尋找相同值的物件,如果找到,就把這個物件的地址賦給當前創 建的物件,因此,c和d實際上都指向了c的引用。因此在使用==時會返回true。
當用new建立物件時,是在堆中重新分配記憶體,因此棧中的引用是不相同的,所以,a和b引用的是值相同的不同物件。所以a==b返回false
2.既然equals比較的是引用,那麼a.equals(b)為什麼返回true。這是因為在Integer裡,重寫了equals方法!
我們可以自己建立一個類,並驗證。
1.當自定義Value類中沒有重寫equals方法時,呼叫equals方法返回結果為false。說明此時equals比較的並不是內容。
2.重寫equals方法。