雖然兩個不同的對象可能具有相同的哈希碼,但是,System.identityHashCode()
似乎會返回該對象的內存指針。我猜在32位JVM實現中可能沒有例外,包括Sun JDK,Open JDK。雖然我沒有檢查源代碼。在實踐中,我是否可以假設與System.identityHashCode()
相同的兩個對象是相同的?我可以假設兩個具有相同System.identityHashCode的對象是相同的嗎?
回答
簡短的回答是否定的。
按照該documentation,System.identityHashCode(Object)
...
返回相同的散列碼爲給定的對象會被默認的方法的hashCode(返回),給定對象的類是否重寫hashCode( )。
那麼接下來讓檢查Object.hashCode()
的documentation ...
儘可能多是合理可行的,由Object類定義的hashCode方法不會返回不同的整數針對不同的對象。 (這一般是通過將該對象的內部地址轉換成一個整數來實現的,但不是由在Java編程語言需要這種實現技巧。)
答案是否定的。
System.identityHashCode()只需返回Object.hashCode()。
返回相同的散列碼爲給定的對象會被默認的方法的hashCode(返回 ),給定對象的 類是否重寫hashCode()。空引用的哈希碼爲零。
雖然Object.hashCode()
多達是合理可行,通過 類對象定義的hashCode方法不會返回針對不同的對象不同的整數。 (此 通常通過轉換所述 對象的內部地址轉換成一個整數來實現的,但是這種實現的技術是不被的JavaTM編程語言不需要 。)
然而,存在孫bug JDK指出兩個對象可以返回相同的哈希碼。
+1以供參考。 – Jeremy
有你的問題
首先,這是什麼System.identityHashCode(Object)返回只有兩件事情。
返回與默認方法hashCode()返回給定對象相同的哈希代碼,無論給定對象的類是否覆蓋hashCode()。空引用的哈希碼爲零。
二,什麼是哈希碼規則時比較兩個對象的相等。
合同說,如果兩個對象是相等的使用equals(Object)方法,就應該有相同的hashCode,但如果兩個對象具有相同的哈希碼,他們不一定相等。
- 1. 我可以擁有兩個具有相同屬性名稱的對象嗎?
- 2. 兩個對象有相同的引用是絕對相同的?
- 3. System.identityHashCode()給不同的對象相同的值
- 4. 兩個不相等的對象具有相同的散列碼
- 5. 不能兩個ListItem對象具有相同的值屬性嗎?
- 6. 兩個AsyncTasks可以共享相同的SQLiteDatabase對象嗎?
- 7. 兩個相等的對象必須具有相同的toString輸出嗎?
- 8. 查看兩個對象是否具有相同的類型
- 9. 我可以使AutoMapper有時返回相同的對象嗎?
- 10. 我可以假設Object.keys的響應順序是否相同?
- 11. 具有相同哈希碼的兩個Java對象不一定相等嗎?
- 12. 是否有可能有2個不同的NSNumber對象具有相同的值?
- 13. 我可以有多個$ _GET具有相同的密鑰,不同的值嗎?
- 14. 2個對象可以有相同的密鑰名稱嗎?
- 15. 有可能有兩個設備具有相同的UUID?
- 16. 我們可以上傳兩個具有相同包標識符或相同名稱的應用程序嗎?
- 17. 兩個結構具有相同可變
- 18. 的Java比較兩個相同的對象提供虛假
- 19. 是否可以投兩個不同的課程,但具有相同的屬性?
- 20. 是否有可能有兩個具有相同名稱的ConnectionStrings?
- 21. 存儲兩個具有相同名稱的變量的對象
- 22. objective-c分配的兩個對象具有相同的內存?
- 23. 我可以使一個對象與另一個對象具有相同的順序嗎?
- 24. 兩個不同的類可以繼承相同的基類嗎?
- 25. 我可以假設爲相同的iOS設備相同的應用程序的速度爲所有用戶
- 26. Android:可以將相同的位圖設置爲兩個ImageViews嗎?
- 27. 我們可以擁有兩種具有相同擴展名的DSL語言嗎?
- 28. 具有相同相對
- 29. 我可以製作具有相同簽名的String + lambda表嗎?
- 30. 我可以創建與自身類型相同的對象嗎?
爲什麼不用'=='來比較它們,而不是*表示它們是相同的。 –
如果你喜歡編寫不可移植的代碼,答案是「是」:) – dasblinkenlight
我不會將應用程序邏輯基於方法的內部實現,尤其是考慮到優秀的Javadoc for Object.hashcode。 – Perception