文章目錄
-
- equals()
- hashcode()
- equals()和hashcode()
- 怎樣重寫equals()
equals()
在java中,等價可以分為兩大類:
-
引用等價性(==)
也就是簡單粗暴的判斷引用的位址是否相同
-
對象等價性
也就是判斷兩個對象邏輯上是否等價,也分為兩種方法:行為等價性及觀察等價性。而equals()就是判斷對象等價性。
hashcode()
java中對hashcode()的作用:
hashCode()的作用是為了提高在散列結構存儲中查找的效率,線上性表中沒有作用;隻有每個對象的 hash 碼盡可能不同才能保證散列的存取性能,事實上 Object 類提供的預設實作确實保證每個對象的 hash 碼不同(在對象的記憶體位址基礎上經過特定算法傳回一個 hash 碼)。
java中對hashcode()的規約:
- 程式執行期間隻要對象 equals 方法比較操作所用到的資訊沒有被修改,則對這同一個對象無論調用多次 hashCode 方法都必須傳回同一個整數。
- 如果兩個對象根據 equals 方法比較是相等的則調用這兩個對象中任意一個對象的 hashCode 方法都必須産生同樣的整數結果。
- 如果兩個對象根據 equals 方法比較是不相等的,則調用這兩個對象中任意一個對象的 hashCode 方法不一定要産生相同的整數結果
hashcode()與==的關系
若 == 傳回true,則兩邊的對象的hashCode()傳回值必須相等,若 == 傳回false,則兩邊對象的hashCode()傳回值可能相等,也可能不等,因為Java中對象預設的equals()方法就是用==實作的。
equals()和hashcode()
hashcode()說白了就是類的哈希值,那為什麼重寫equals時要重寫hashcode()。
因為在某些元素不可重複的集合類中(如HashMap,HashSet)為了避免每次添加元素時都要進行複雜的equals()比較,是以會先比較hashcode(),當有已存在元素hashcode()相等時才會進行equals()比較,這樣就大大提升了效率。
但這也使得當我們重寫equals()時,如果不重寫hashcode()會導緻利用hashcode()的集合類無法正常使用。
注: 下面附一張關于HashMap,HashSet的比較流程
怎樣重寫equals()
public boolean equals(Object obj) {
if(obj==this)
return true;
if(obj==null)
return false;
//假設我要比較的類為try1
if(! (obj instanceof try1))
return false;
try1 other=(try1)obj;
//這裡填寫對于内部rep的比較
...
return false;
}