==、equals()、hashCode、hashCode在集合中的做用

       (1)==可用於基本類型和引用類型:當用於基本類型時候,是比較值是否相同;當用於引用類型的時候,是比較對象是否相同。       對於String a = 「a」; Integer b = 1;這種類型的特有對象建立方式,==的時候值是相同的。 java

       (2)基本類型沒有equals方法,equals只比較值(對象中的內容)是否相同(相同返回true)。 編碼

       (3)一個類若是沒有定義equals方法,它將默認繼承Object中的equals方法,返回值與==方法相同 code


①==和equals的實質。 對象

       在JAVA中利用"=="比較變量時,系統使用變量在"棧"中所存的值做爲比較的依據。 繼承

       基本數據類型在"棧"中存的是其內容值,而對象類型在"棧"中存的是地址,這些地址指向"堆"中的對象。 內存

       java.lang包中的Object類有public boolean equals(Object obj)方法,它比較兩個對象是否相等。 md5

       其它對象的equals方法僅當被比較的兩個引用指向的對象內容相同時,對象的equals()方法返回true。 hash

       總之,"=="和"!="比較的是地址.也可認爲"=="和"!="比較的是對象句柄;而equals()比較的是對象內容.或者說,,"=="和"!="比較的是"棧"中的內容,而equals()比較的是"堆"中的內容. hashmap


②==操做符。專門用來比較兩個變量的值是否相等,也就是用於比較變量所對應的內存中所存儲的數值是否相同,要比較兩個基本類型的數據或兩個引用變量是否至關,只能用==操做符。 變量

      Java的基本數據類型爲(char,byte,short,int,long,float,double,boolean)。

      若是一個變量指向的數據是對象類型的,那麼,這時候涉及了兩塊內存,對象自己佔用一塊內存(對內存),變量自己也佔用一塊內存,例如Object obj = new Object()變量obj是一個內存,new Object()是一個內存,此時,變量所對應的內存中存儲的數據就是對象佔用的那塊內存的首地址。對於指向對象內存的變量,若是要比較兩個變量是否指向同一個對象,即要看這兩個變量所對應的內存中的數值是否相等,這時候就須要用==操做符進行比較。


 ③構造器造成的差異。對於String和Integer來講,因爲他們特有的建立對象的方式。使用構造器和不使用構造器獲得一個對象,==方法比較所產生的結果是不一樣的。 String a = 「abc」; String b = "abc"; 此時a==b獲得結果爲true。String a = new String("abc"); String b = new String("abc");此時a==b獲得的結果爲false。Integer a = 1; Integer b = 1;此時a==b的結果是true。Integer a = new Integer(1); Integer b = new Integer(1);此時a==b獲得的結果爲false。

       經過這一點其實咱們也可以更加容易理解==對內存的實際操做,實際執行的是近似於基本類型比較。


hashCode:

hashcode這個方法是用來鑑定2個對象是否相等的。那你會說,不是還有equals這個方法嗎?不錯,這2個方法都是用來判斷2個對象是否相等的。可是他們是有區別的。

通常來說,equals這個方法是給用戶調用的,若是你想判斷2個對象是否相等,你能夠重寫equals方法,而後在代碼中調用,就能夠判斷他們是否相等了。簡單來說,equals方法主要是用來判斷從表面上看或者從內容上看,2個對象是否是相等。舉個例子,有個學生類,屬性只有姓名和性別,那麼咱們能夠認爲只要姓名和性別相等,那麼就說這2個對象是相等的。
hashcode方法通常用戶不會去調用,好比在hashmap中,因爲key是不能夠重複的,他在判斷key是否是重複的時候就判斷了hashcode這個方法,並且也用到了equals方法。這裏不能夠重複是說equals和hashcode只要有一個不等就能夠了!因此簡單來說,hashcode至關因而一個對象的編碼,就好像文件中的md5,他和equals不一樣就在於他返回的是int型的,比較起來不直觀。咱們通常在覆蓋equals的同時也要覆蓋hashcode,讓他們的邏輯一致。舉個例子,仍是剛剛的例子,若是姓名和性別相等就算2個對象相等的話,那麼hashcode的方法也要返回姓名的hashcode值加上性別的hashcode值,這樣從邏輯上,他們就一致了。

要從物理上判斷2個對象是否相等,用==就能夠了。
相關文章
相關標籤/搜索