java中“==”、equals和hashCode的區別

1.“==”運算符是用來比較兩個變量的值是否相等。也就是比較變量對應的內存中所存儲的數值是否相同,要比較兩個基本類型的數據或兩個引用類型變量是否相等只能使用“”來比較。
如果變量是基本數據類型,那麼可直接用“
”比較。
例:

String s = "hello";
String t = "hello";
s==t;

返回的是true。

如果變量是 指向數據的對象(引用類型),那麼此時涉及到兩塊內存,對象本身佔用一塊內存空間(堆內存),變量也佔用一塊內存。
如:

String s = new String("hello");

變量s佔用一塊存儲空間,而new String("hello")則存儲在另一塊存儲空間裏。此時,變量s的值就是new String("hello")佔用內存的首地址。
例:

 String s = new String("hello");
 String t = new String("hello");
 s==t;

返回的是false。

所以:基本數據類型,那麼可直接用“==”比較;當比較是對象(引用類型)時,比較的兩個對象的內存地址是否一樣,也就是是否指向一個對象。

2.equals是Object類提供的方法之一。每一個Java類都繼承自Object類,所以每一個對象都具有equals這個方法。Object類中定義的equals(Object)方法是直接使用“”運算符比較兩個對象,所以在**沒有覆蓋equals(Object)方法的情況下,equals(Object)和“”一樣,比較的是引用。**

相比“==”運算符,equals(Object)方法的特殊之處在於它可以被覆蓋,所以通過覆蓋的方法讓它比較數據內容而不是比較引用。如String類覆蓋了equals(Object)方法**(而StringBuffer的equals方法沒有覆蓋Object的方法)**,所以String類的equals()方法是用於比較兩個獨立對象的內容是否相同。

Object類中的equals方法:
這裏寫圖片描述
用==比較了是否指向同一地址,也就是是否是同一個對象

String類中的equals方法:
這裏寫圖片描述

先比較了是否是同一個對象,然後在一個個字符比較

例如:

String s = new String("hello");
String t = new String("hello");
s==t;//s.equals(t);

返回的是false,而s.equals(t)將返回true。所以要比較量比較兩個實例對象的內容是否相同,那你必須覆蓋equals()方法,然後再進行比較。

3.**hashCode()**方法是從Object類中繼承過來的,它也用來鑑定兩個對象是否相等。Object類中的hashCode()方法返回對象是在內存中地址轉換成的一個int值,所以如果沒有重寫hashCode()方法,任何對象的hashCode()方法都是不相等的。
既然說hashCode()也是用來鑑定兩個對象是否相等,那麼它和equals()方法有什麼區別呢?
一般來說,**equals()方法是給用戶調用的,如果你想判斷2個對象是否相等,你可以重寫equals()方法,然後在代碼中調用,就可以判斷他們是否相等了。簡單來講,equals()方法主要是用來判斷從表面上看或者從內容上看,2個對象是不是相等。舉個例子,有個學生類,屬性只有姓名和性別,那麼我們可以認爲只要姓名和性別相等,那麼就說這2個對象是相等的。
hashCode()方法一般用戶不會去調用它,比如在hashmap中,由於key是
不可以重複的
,它在判斷key是不是重複的時候就判斷了hashCode()這個方法,而且也用到了equals()方法。這裏不可以重複是說equals()和hashCode()只要有一個不等就可以了!所以簡單來講,hashCode()相當於是一個對象的編碼,就好像文件中的md5,它與equals()不同就在於他返回的是int型的,比較起來不直觀。
一般在覆蓋equals()的同時也要覆蓋hashCode(),否則,就會違反Object.hashCode的通用約定,從而導致該類無法與所有基於散列值(hash)的集合類(HashMap、HashSet和Hashtable)結合在一起正常運行。
hashCode()方法的返回值和equals()方法發關係:

x.equals(y)
	返回true,那麼調用這2個對象中任意一個對象的hashCode()方法都必須產生同樣的整數結果
	返回false,那麼x和y的hashCode()方法發返回值有可能相等,也有可能不想等。
	反之,hashCode()方法返回值不相等,equals()方法返回值一定不相等。hashCode()方法返回值相等,equals()方法返回值可能相等,也可能不相等。
發佈了26 篇原創文章 · 獲贊 186 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章