回答
您可以使用ThreadLocal
作爲像任何其他對象一樣的HashMap鍵。它是否有任何意義是一個不同的話題。
基本上你可以有問題,如果你使用了可變對象爲喜歡的事情HashMap
,HashSet
等的關鍵,因爲這些類通常使用hashCode()
(因此得名),把東西在水桶和檢索。因此,如果您使用可變對象作爲鍵,然後更改對象(以hashCode更改的方式),然後嘗試通過鍵檢索條目,則不會再找到條目,因爲映射將顯示在錯誤的存儲桶中入口。
在ThreadLocal
這種情況將不會是一個問題,因爲它沒有覆蓋equals()
和hashCode()
因此如果您更改對象hashCode()
不會改變,所以你可以安全使用ThreadLocal
關鍵。
由於雅羅斯瓦夫帕夫拉克評論,因爲ThreadLocal
沒有實現hashCode()
和equals()
它是不適合在HashMap
的關鍵,至少如果你希望它是表現良好。
即使這樣做,也沒用。考慮到ThreadLocal
的用例,使用包含的對象作爲密鑰會更加清楚。
映射與一個ThreadLocal
(具有線程特定的內容)映射只是最終有內部映射ThreadLocal
(映射線程值的值)被用於實際映射。
更不用說ThreadLocal
實例有點被推薦。通過引入「本地」線程本地類,如java.util.concurrent.ThreadSafeRandom
解決了它們的常見用例。
一個對象的行爲有什麼問題,不重寫'hashCode'和'equals'?它只是一個基於身份的哈希映射。如果你使用同一個對象,這是完美的表現。 – RealSkeptic
@RealSkeptic,所以我會說這個答案是錯誤的。:-) – Vampire
因爲如果你想要'IdentityHashMap',你應該明確地使用它。使用帶有額外的'ThreadLocal' weirdery的常規'HashMap'只是不清楚編程。 – Kayaman
- 1. 孩子的ThreadLocal可以用父母的ThreadLocal值修改嗎?
- 2. 我們可以在hashmap中插入重複鍵嗎?
- 3. ArrayList中的字符串用作HashMap中的鍵嗎?
- 4. 是否可以使用HashSet作爲HashMap的關鍵字?
- 5. 使用ThreadLocal存儲請求的Locale可以嗎?
- 6. 修改類,以便它可以被用作HashMap中的關鍵字
- 7. 外鍵可以作爲主鍵嗎?
- 8. 將外鍵作爲主鍵可以嗎?
- 9. ArrayList作爲Hashmap中的鍵
- 10. android.util.Pair作爲HashMap中的鍵
- 11. 我可以將HashMap鍵和值交換到其他嗎?
- 12. 在OSGi上使用ThreadLocal可以安全嗎?
- 13. 爲什麼我可以使用字符串作爲HashMap中的鍵?
- 14. 我可以有一個非空的hashmap,其中沒有任何鍵嗎?
- 15. Java HashMap可以創建死鎖嗎?
- 16. 我可以使用std :: pair作爲std :: multimap中的鍵嗎?
- 17. 可以使用浮點數作爲對象中的鍵嗎?
- 18. 可以使用NSLocalizedString作爲字典中的鍵嗎?
- 19. 我可以使用協議對象作爲NSDictionary中的鍵嗎?
- 20. 我可以在Java中使用JSONObject而不是HashMap嗎?
- 21. 我們可以在多線程環境中使用Hashmap嗎?
- 22. 用Integer作爲鍵的HashMap的問題
- 23. 外鍵引用的主鍵可以是mysql中的varchar(255)嗎?
- 24. 在Arduino Uno中可以使用鍵盤作爲輸入嗎?
- 25. 在Django中可以使用PositiveIntegerField作爲外鍵嗎?
- 26. 操作中可以使用Android修飾鍵重置嗎?
- 27. 在python中使用類作爲字典鍵可以嗎?
- 28. 我可以在Javascript/jQuery中使用變量作爲鍵嗎?
- 29. Rails:我可以使用外鍵作爲一對一關係中的主鍵嗎?
- 30. 是否可以使用雙引號字符作爲hashmap鍵的一部分?
這聽起來像一個非常糟糕的主意。 ''ThreadLocal'實例並不意味着被這樣使用,很大程度上取決於它的'equals'方法,它可能會根據哪個線程調用它而給出不同的結果。你爲什麼不使用'ThreadLocal'持有的值? –
這個問題很奇怪。一方面,這是一個奇怪的想法。另一方面,這真是太古怪了,我真的開始思考這個問題。不幸的是,這不是應該在這裏提出的問題。請參閱:http://stackoverflow.com/help/on-topic和http://stackoverflow.com/help/dont-ask –
快速瀏覽後,我發現'ThreadLocal'沒有實現'equals'和'hashCode'方法。所以它不會工作。 –