摘要:我們使用調試器卻發現在中已經存儲了這個對象。中和有一個契約如果兩個對象相等的話,它們的必須相等但如果兩個對象的相等的話,這兩個對象不一定相等。的結構能夠快速找到一個對象,而不是進行較慢的線性查找。可以看作是數組的數組。
java.lang.Object類中有兩個非常重要的方法:
public boolean equals(Object obj) public int hashCode()
理解這兩個方法非常的重要,尤其是將用戶自定義的對象添加到Map中的時候。有時候就算是久經沙場的老程序員也弄不清楚該如何正確使用它們。這篇文章中,我將用一個例子讓大家看看大家經常會犯的錯誤,然后解釋equals()和hashCode()的正確的使用方法。
常見的錯誤如下:
import java.util.HashMap; public class Apple { private String color; public Apple(String color) { this.color = color; } public boolean equals(Object obj) { if (!(obj instanceof Apple)) return false; if (obj == this) return true; return this.color == ((Apple) obj).color; } public static void main(String[] args) { Apple a1 = new Apple("green"); Apple a2 = new Apple("red"); //hashMap stores apple type and its quantity HashMap m = new HashMap(); m.put(a1, 10); m.put(a2, 20); System.out.println(m.get(new Apple("green"))); } }
這個例子中,一個“綠蘋果”的對象成功添加到hashMap中了,但是當我們要取出這個“綠蘋果”的時候,卻得不到這個對象,程序返回null。我們使用調試器卻發現在hashMap中已經存儲了這個對象。
這個問題是因為”hashCode()”方法沒有被重寫。Java中equals()和hashCode()有一個契約:
如果兩個對象相等的話,它們的hash code必須相等;
但如果兩個對象的hash code相等的話,這兩個對象不一定相等。
Map的結構能夠快速找到一個對象,而不是進行較慢的線性查找。使用hash過的鍵來定位對象分兩步。Map可以看作是數組的數組。第一個數組的索引就是對鍵采用hashCode()計算出來的值,再在這個位置上查找第二個數組,使用鍵的equals()方法來進行線性查找,直到找到要找的對象。
Object類中的hashCode()對于不同的對象返回不同的整數,所以上面的例子中,不同的對象(即使相同的類型)也返回不同的hash值。
Hash碼就像是一個存儲空間的序列,不同的東西放在不同的存儲空間中。將不同的東西整理放在不同的空間中(而不是堆積在一個空間中)更高效。所以能夠均勻的分散hash碼是再好不過了。
上面錯誤的解決方法就是在類中增加hashCode方法。這里我僅僅使用顏色的長度來計算hash碼。
public int hashCode(){ return this.color.length(); }
原文:Java equals() and hashCode() Contract
翻譯:ImportNew.com - 唐小娟
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64050.html
摘要:抽象函數引發的關系是等價關系。所以當且僅當通過調用抽象數據類型的任何操作不能區分它們時,兩個對象是相等的。必須為每個抽象數據類型適當地定義操作。一般來說,在面向對象編程中使用是一種陋習。 大綱 什么是等價性?為什么要討論等價性?三種等價性的方式==與equals()不可變類型的等價性對象契約可變類型的等價性自動包裝和等價性 什么是等價性?為什么要討論等價性? ADT上的相等操作 ADT...
對象排序 List l可以如下排序。 Collections.sort(l); 如果List包含String元素,它將按字母順序排序,如果它由Date元素組成,它將按時間順序排序,這是怎么發生的?String和Date都實現了Comparable接口,Comparable實現為類提供了自然的順序,允許該類的對象自動排序,下表總結了一些實現Comparable的更重要的Java平臺類。 類 自然...
摘要:程序失敗時,很難確定錯誤的位置。它保護客戶免受單位工作細節的影響。將前提條件放在中,并將后置條件放入和。涉及可變對象的契約現在取決于每個引用可變對象的每個人的良好行為。設計規約按規約分類比較規約它是如何確定性的。 大綱 1.編程語言中的功能/方法2.規約:便于交流的編程,為什么需要規約 行為等同規約結構:前提條件和后條件測試和驗證規約3.設計規約分類規約圖表規約質量規約4.總結 編程...
摘要:如果根據方法得到兩個對象不相同,那么兩個對象的方法的結果不一定不相同,我們可以利用這一點來提高散列表的性能。最后回到文章開頭的問題,如何判斷兩個對象或值是否相同這個問題其實有兩方面的含義,一方面是判斷的方法,另一方面是判斷的效率。 Java中有很多場景需要判斷兩個對象或者兩個值,那么 判斷是否相同的依據是什么? 如何判斷是否相同呢? 為了解釋這個問題,我們從Java語言的根說起,那...
摘要:相關的文章網上很多了寫這個主要是按自己的思路進行記錄是什么中的實現是一個本地方法生成一個表征當前對象實例的特征值具體的實現根據的實現可能會不同中實際計算的函數的實現如下為時是直接使用的內存地址但默認使用的是的隨 hashcode相關的文章網上很多了, 寫這個主要是按自己的思路進行記錄 hashCode是什么 Object中的hashCode實現是一個本地方法, 生成一個表征當前對象實例...
閱讀 2932·2021-11-04 16:06
閱讀 769·2021-09-30 09:56
閱讀 1835·2021-09-22 10:02
閱讀 2618·2019-08-29 13:43
閱讀 2210·2019-08-29 13:42
閱讀 2295·2019-08-29 12:21
閱讀 1049·2019-08-29 11:29
閱讀 1381·2019-08-26 13:51