1. 程式人生 > >==、equals()、hashcode()的關係和區別

==、equals()、hashcode()的關係和區別

==、equals()、hashcode()概念

==:它的作用是判斷兩個物件的地址是不是相等。即,判斷兩個物件是不試同一個物件。

equals():它的作用也是判斷兩個物件是否相等。但它一般有兩種使用情況:

  情況1,類沒有覆蓋equals()方法。則通過equals()比較該類的兩個物件時,等價於通過“==”比較這兩個物件。

       情況2,類覆蓋了equals()方法。一般,我們都覆蓋equals()方法來兩個物件的內容相等;若它們的內容相等,則返回true(即,認為這兩個物件相等)。

hashcode():獲取雜湊碼,也稱為雜湊碼.是一個本地native方法,返回的是物件引用中儲存的物件的記憶體地址

equals()、hashcode()關係

1.equal()相等的兩個物件他們的hashCode()肯定相等,也就是用equal()對比是絕對可靠的。

2.hashCode()相等的兩個物件他們的equal()不一定相等,也就是hashCode()不是絕對可靠的。

對於需要大量並且快速的對比的話如果都用equal()去做顯然效率太低,所以解決方式是,每當需要對比的時候,首先用hashCode()去對比,如果hashCode()不一樣,則表示這兩個物件肯定不相等(也就是不必再用equal()去再對比了),如果hashCode()相同,此時再對比他們的equal(),如果equal()也相同,則表示這兩個物件是真的相同了,這樣既能大大提高了效率也保證了對比的絕對正確性。

重寫equals()方法就必須重寫hashCode()方法的原因

重寫equals()方法就必須重寫hashCode()方法主要是針對HashSet和Map集合型別。集合框架只能存入物件(物件的引用(基本型別資料:自動裝箱))。

在向HashSet集合中存入一個元素時,HashSet會呼叫該物件(存入物件)的hashCode()方法來得到該物件的hashCode()值,然後根據該hashCode值決定該物件在HashSet中儲存的位置。簡單的說:HashSet集合判斷兩個元素相等的標準是:兩個物件通過equals()方法比較相等,並且兩個物件的HashCode()方法返回值也相等。如果兩個元素通過equals()方法比較返回true,但是它們的hashCode()方法返回值不同,HashSet會把它們儲存在不同的位置,依然可以新增成功。同樣:在Map集合中,例如其子類Hashtable,HashMap,儲存的資料是<key,value>對,key,value都是物件,被封裝在Map.Entry,即:每個集合元素都是Map.Entry物件。在Map集合中,判斷key相等標準也是:兩個key通過equals()方法比較返回true,兩個key的hashCode的值也必須相等。判斷valude是否相等equal()相等即可。