散列映射和散列表中的鍵類型是否存在約束?----訪問問題。 我認爲是的,我們可以根據需要進行定製。散列映射數據類型是否有任何約束
3
A
回答
2
從技術上講,沒有。通常,您想要使用實現equals()和hashCode()的對象,儘管這不是必需的。如果你不這樣做,那麼它將使用Object定義的基類實現來比較對象標識。很多時候,這是不恰當的,但有時候很好。
從技術上講,只要equals()和hashCode()實現中使用的值是不可變的,密鑰不需要是不可變的。例如,如果您的Foo類使用字符串「foo」作爲它的一部分,那麼該值「foo」不得更改。這是因爲哈希映射出於效率原因將密鑰放入基於hashCode()值的桶中。如果hashCode突然變化,那麼散列圖就不知道了,而且鍵將存在於錯誤的桶中,並且會遇到令人討厭的bug,因爲這樣就有可能在地圖中存在「重複」對象。希望這是有道理的。
1
幾件事情要考慮:
只是對「類型」,則無法使用基本類型。這是Java的語言約束。例如
HashMap<int, Foo>
是無效的,你需要使用HashMap<Integer, Foo>
基礎上的方式HashMap的工作,關鍵要有一個有意義實現的hashCode()和equals()的。它是如何「有意義」取決於你的需要。 Object中的默認實現可能已經滿足您的需求,但您需要了解它。
一旦一個對象實例放入Map中作爲鍵,它的hashCode()和equals()應該保持一致。您不應該放入地圖,並將對象實例的狀態更改爲Key,並使hashCode()/ equals()返回不同的值。確保它最簡單的方法當然是使用不可變對象作爲關鍵。但是,使用可變對象仍然很好,但在代碼中,確保不會改變鍵的狀態。
相關問題
- 1. 歸類數據散列映射
- 2. 數據庫約束是否映射到業務邏輯
- 3. 泛型類型約束似乎沒有約束任何東西
- 4. 類型約束的反射
- 5. varchar列的Grails GORM映射約束
- 6. 反映了泛型類型約束
- 7. NHibernate映射約束違規
- 8. ProJNA數據類型映射
- 9. Knockout.js映射沒有約束力
- 10. 是否可以將具有相同數據類型的多個列映射到sqoop中的新數據類型?
- 11. 類型參數約束是一個類
- 12. 在約束存在限定的高階類型映射
- 13. 如何從散列映射
- 14. 密鑰是否有散列表映射到內存位置?
- 15. Python中是否存在任何類型的散列表
- 16. 如何將oracle數據類型映射到java數據類型?
- 17. 如何映射對象數據類型
- 18. 檢查類型是否爲映射
- 19. IBodyModelValidator你是否缺少類型映射?
- 20. 如何映射散列數組?
- 21. 類型約束
- 22. 查找列是否有唯一約束
- 23. 對數據類型的MongoDB約束
- 24. Hacklang - 是否可以使用類型常量的類型約束?
- 25. 如何防止使用類型約束的循環多項式散列函數?
- 26. 類型參數約束
- 27. 射型家庭和約束
- 28. 映射列類型Slick 3.1.1
- 29. 是否有可能「混入:附加類型約束
- 30. Symfony2:類型約束是否與Doctrine ORM列類型定義結合使用?
必須實現'hashCode()'和'equals()'有意義。 – jlordo 2013-03-27 01:02:50
鍵應該是不可變的,否則會遇到奇怪的問題。 – 2013-03-27 01:04:35