1. 程式人生 > 其它 >hashCode()和equals()終於傻傻可以分清楚了

hashCode()和equals()終於傻傻可以分清楚了

一.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()方法