天天看點

Java hashCode() 和 equals()

①equals() 的作用

equals() 的作用是 用來判斷兩個對象是否相等。

equals() 定義在JDK的Object.java中。通過判斷兩個對象的位址是否相等(即,是否是同一個對象)來區分它們是否相等。

②equals() 與 == 的差別是什麼?

== : 它的作用是判斷兩個對象的位址是不是相等。即,判斷兩個對象是不試同一個對象。

equals() : 它的作用也是判斷兩個對象是否相等。但它一般有兩種使用情況(前面第1部分已詳細介紹過):

                 情況1,類沒有覆寫equals()方法。則通過equals()比較該類的兩個對象時,等價于通過“==”比較這兩個對象。

                 情況2,類覆寫了equals()方法。一般,我們都覆寫equals()方法來兩個對象的内容相等;若它們的内容相等,則傳回true(即,認為這兩個對象相等)。

③hashCode() 的作用

hashCode() 的作用是擷取哈希碼,也稱為散列碼;它實際上是傳回一個int整數。這個哈希碼的作用是确定該對象在哈希表中的索引位置。

hashCode() 在散清單中才有用,在其它情況下沒用。在散清單中hashCode() 的作用是擷取對象的散列碼,進而确定該對象在散清單中的位置。

我們都知道,散清單存儲的是鍵值對(key-value),它的特點是:能根據“鍵”快速的檢索出對應的“值”。這其中就利用到了散列碼! 散清單的本質是通過數組實作的。當我們要擷取散清單中的某個“值”時,實際上是要擷取數組中的某個位置的元素。而數組的位置,就是通過“鍵”來擷取的;更進一步說,數組的位置,是通過“鍵”對應的散列碼計算得到的。

④我們以HashSet為例,來深入說明hashCode()的作用。

 假設,HashSet中已經有1000個元素。當插入第1001個元素時,需要怎麼處理?因為HashSet是Set集合,它允許有重複元素。

        “将第1001個元素逐個的和前面1000個元素進行比較”?顯然,這個效率是相等低下的。散清單很好的解決了這個問題,它根據元素的散列碼計算出元素在散清單中的位置,然後将元素插入該位置即可。對于相同的元素,自然是隻儲存了一個。

        由此可知,若兩個元素相等,它們的散列碼一定相等;但反過來确不一定。在散清單中,

                           1、如果兩個對象相等,那麼它們的hashCode()值一定要相同;

                           2、如果兩個對象hashCode()相等,它們并不一定相等。

                           注意:這是在散清單中的情況。在非散清單中一定如此!