hashCode()和equals()終於傻傻可以分清楚了
阿新 • • 發佈:2021-07-17
一.hashCode()和equals()作用
1.hashCode()和equals()都是Obiect類中的方法
先看看Object類中這兩個方法的定義:
Object 的 hashCode 方法是本地方法,也就是用 c 或 c++ 實現的,該方法直接返回物件的記憶體地址
Object 的 equals 方法是用 == 去比較兩個物件的地址值是否相等
但實際應用中,我們一般比較兩個物件是否相等,是通過這兩個物件的成員屬性來判斷的.故需要去重寫這兩個方法:
如果類中不重寫此方法:
hashCode(): 返回的是物件的地址值
equals(): 比較兩個物件的地址值是否相等
如果類中重寫此方法 :
hashCode(): 返回的是根據物件的成員變數,計算出的一個整數值
equals(): 比較兩個物件的成員資訊是否相同
2.類中重寫hashCode()和equals()來比較兩個物件是否相等
equals()比較是相等的,那麼hashCode()肯定相等,也就是equals()是絕對可靠的;
hashCode()比較是相等的,那麼equals()不一定相等,也就是hashCode()不是絕對可靠的;
3.既然equals()比較是絕對可靠的,為啥還要重寫hashCode()呢
對於一個有大量成員資訊的物件來說,通過equals()去比較的話效率是很低的
所以,一般是通過hashCode()和equals()搭配使用來提高效率 :
先用hashCode()比較,如果不同則兩個物件一定不相等;
如果相同則再通過equals()進行比較
==>HashSet集合能保證元素的唯一性,底層正是通過hashCode()和equals()來實現的
二.HashSet集合元素唯一性原理
其新增元素的add()方法再執行過程中,是進行了元素的判斷的,這個判斷流程是:
1.先比較元素的雜湊值是否相同,這個雜湊值就是通過元素的hashCode()計算出來的
2-1.如果雜湊值不同,則直接新增到集合中;
2-2.如果雜湊值相同,則繼續通過equals()來比較
3-1.返回true,說明元素重複,不新增
3-2.返回false,說明元素不重複,新增
結論:
我們使用HashSet集合來儲存物件,你想保證元素的唯一性,就必須重寫它的hashCode()和equals()方法