2015-12-10 102 views
0

我發現這句話在我的書:平等哈希碼的對象爲什麼不能等於

如果兩個對象的散列碼是平等的,這可能並不意味着對象 是平等的。

是否有人可以解釋我這句話?

+0

有2個相等的對象之間的差(=在存儲器地址相同)以相等的內容2和對象(=不同的地址在存儲器中)。 –

+1

可能重複[Hashcode()Vs Equals()](http://stackoverflow.com/questions/11850929/hashcode-vs-equals) – proudandhonour

+0

如果hashcodes的類型爲int,並且您的對象包含String不可能爲每個對象使用不同的哈希碼。因此,對於兩個對象是相等的,它是一個**需求**,但不是**足夠**條件以使得所述哈希碼相等。換句話說,哈希碼沒有**類型1錯誤**,但爲了實現它具有**類型2錯誤**的潛在高速率。 –

回答

6

答案很簡單:hashCode()意外地可以爲兩個完全不同的對象產生相同的數字。

+0

@Downvoters:爲什麼? –

+2

我假設「_accidentally can produce_」是downvotes的來源。這意味着哈希碼是一些產生隨機值的隨機魔術方法。事實上,製造衝突的決定非常慎重**。決定產生哪些衝突是一項重要的性能優化。 –

+2

當然,HotSpot中'hashCode'的默認實現是一個隨機數。如果你覆蓋它,那麼它不再是一個隨機值。例如,請參閱[本文](http://stackoverflow.com/a/26975908/1037316)。 –

1

在當過您檢查兩個對象的平等首先檢查第一哈希碼,如果是相同的兩個對象,哈希基本實現然後調用equals方法它也返回true,那麼只有兩個對象被視爲相等。

10

例如,考慮Long類的兩個對象。由於hashCode返回intlong(和Long)類型的範圍大於int,這意味着必須有兩個具有相同hashCode的對象,即使它們彼此不相等。

+0

這裏有一個術語:鴿子洞原理 如果鴿子多於洞,最終會在一些洞中出現多羽鴿子。 (見https://en.wikipedia.org/wiki/Pigeonhole_principle) –

0

2等號對象將具有相同的哈希碼。

2個具有相同hascode的對象不必相同。

讓說的hascode方法產生它通過counten名字的字母的數值(不好的做法,但我用這個例子來解釋),但平等的每一個字符進行比較:

保羅和瑪麗會都返回hascode 4,但字符不相等

4

的哈希代碼是用於插入並基於散列的集合識別對象的數值。

它是一個固定大小的值,因此它不能對每個現有對象都是唯一的,所以它不時會發生衝突。基本上,hashCode()可以爲兩個不同的對象產生相同的值。

實施例:

String first = "wh"; 
    String second = "xI"; 
    System.out.println(first.equals(second)); 
    System.out.println(first.hashCode() + " " + second.hashCode()); 
+0

使用示例,不錯! +1 –

0

即使對象的哈希碼將是在創建時的存儲器地址它仍然必須被存儲,因爲垃圾收集器的目標首標內。

垃圾收集器可以自由移動物體來完成它的工作,所以當前的內存地址可能隨時改變。但是:

的{@code的hashCode}方法 必須一致地返回相同的整數,所提供的物體上在{@code等於}不使用信息 比較被修改。