回答
答案很簡單:hashCode()
意外地可以爲兩個完全不同的對象產生相同的數字。
@Downvoters:爲什麼? –
我假設「_accidentally can produce_」是downvotes的來源。這意味着哈希碼是一些產生隨機值的隨機魔術方法。事實上,製造衝突的決定非常慎重**。決定產生哪些衝突是一項重要的性能優化。 –
當然,HotSpot中'hashCode'的默認實現是一個隨機數。如果你覆蓋它,那麼它不再是一個隨機值。例如,請參閱[本文](http://stackoverflow.com/a/26975908/1037316)。 –
在當過您檢查兩個對象的平等首先檢查第一哈希碼,如果是相同的兩個對象,哈希基本實現然後調用equals方法它也返回true,那麼只有兩個對象被視爲相等。
例如,考慮Long類的兩個對象。由於hashCode
返回int
和long
(和Long
)類型的範圍大於int
,這意味着必須有兩個具有相同hashCode
的對象,即使它們彼此不相等。
這裏有一個術語:鴿子洞原理 如果鴿子多於洞,最終會在一些洞中出現多羽鴿子。 (見https://en.wikipedia.org/wiki/Pigeonhole_principle) –
2等號對象將具有相同的哈希碼。
2個具有相同hascode的對象不必相同。
讓說的hascode方法產生它通過counten名字的字母的數值(不好的做法,但我用這個例子來解釋),但平等的每一個字符進行比較:
保羅和瑪麗會都返回hascode 4,但字符不相等
的哈希代碼是用於插入並基於散列的集合識別對象的數值。
它是一個固定大小的值,因此它不能對每個現有對象都是唯一的,所以它不時會發生衝突。基本上,hashCode()可以爲兩個不同的對象產生相同的值。
實施例:
String first = "wh";
String second = "xI";
System.out.println(first.equals(second));
System.out.println(first.hashCode() + " " + second.hashCode());
使用示例,不錯! +1 –
即使對象的哈希碼將是在創建時的存儲器地址它仍然必須被存儲,因爲垃圾收集器的目標首標內。
垃圾收集器可以自由移動物體來完成它的工作,所以當前的內存地址可能隨時改變。但是:
的{@code的hashCode}方法 必須一致地返回相同的整數,所提供的物體上在{@code等於}不使用信息 比較被修改。
- 1. JAXB對象 - 哈希碼和等於
- 2. 哈希方法使用什麼平等?
- 3. 球拍哈希平等
- 4. 爲什麼根對象實現平等?
- 5. 爲什麼Java的Integer類的兩個對象不能等於
- 6. 重寫哈希碼,等於在java中
- 7. 嚴格等於運算符和不等於。爲什麼他們不平等
- 8. 爲什麼在sql server中生成的MD5哈希不相等?
- 9. 哈希等於不表示應該
- 10. 等同於:echo'test content'| git的哈希對象-w --stdin
- 11. 什麼是用於計算對象的哈希碼
- 12. 哈希碼和等於重寫不工作,出了什麼問題
- 13. 平等對象
- 14. 平等對象
- 15. 在.Net中生成的SHA1哈希等效於什麼?
- 16. 爲什麼對象大於/小於或等於不同的對象?
- 17. 爲什麼!==「」不等於!== NULL
- 18. 爲什麼Java中的對象的哈希碼更改?
- 19. 設置哈希碼和等於創建一組唯一的對象
- 20. 等同於Python dict的Ruby哈希setdefault
- 21. 等效於Memcached中的Redis哈希?
- 22. 組合與繼承的平等和哈希碼提供者
- 23. 爲什麼當平等
- 24. 爲什麼\\。平等\。在preg_replace?
- 25. 爲什麼通過belongs_to關聯的對象不等於自己?
- 26. 爲什麼我的.net計算的MD5哈希值等於在網站上計算的哈希值?
- 27. .NET對象平等
- 28. C++對象平等
- 29. 具有相同哈希碼的兩個Java對象不一定相等嗎?
- 30. 在紅寶石中設置哈希等於另一個哈希
有2個相等的對象之間的差(=在存儲器地址相同)以相等的內容2和對象(=不同的地址在存儲器中)。 –
可能重複[Hashcode()Vs Equals()](http://stackoverflow.com/questions/11850929/hashcode-vs-equals) – proudandhonour
如果hashcodes的類型爲int,並且您的對象包含String不可能爲每個對象使用不同的哈希碼。因此,對於兩個對象是相等的,它是一個**需求**,但不是**足夠**條件以使得所述哈希碼相等。換句話說,哈希碼沒有**類型1錯誤**,但爲了實現它具有**類型2錯誤**的潛在高速率。 –