我曾經見過,只有String被用作HashMap中的一個鍵。雖然put()方法以Object作爲參數,但它的重要性如何。如果任何其他對象也可以使用作爲一個關鍵或不? 請提供答案。字符串作爲HashMap中的一個鍵
回答
你還沒有顯示出你正在談論的平臺,但我現在假設它是Java。
您可以在HashMap
中使用任何類型的密鑰,但假設您使用完整的通用版本,則需要指定該類型並將其一致使用。例如,你可以使用URI作爲鍵類型:
HashMap<URI, Integer> hitCountMap = new HashMap<URI, Integer>();
的get
方法需要對象作爲關鍵參數類型,當然你應該使用相同類型的鍵,你已經投入的地圖。請參閱this question以獲得更多關於此的討論。
URL可能是哈希映射中鍵的一個不好的例子。從文檔中,哈希代碼基於與URL比較相關的所有URL組件。這很慢(因爲它涉及到針對名稱服務器解析URL),因此使用URI可能會更好。 當然,這是完全拋開這個問題! – 2009-12-13 10:52:04
謝謝 - 將修復URI :) – 2009-12-13 11:28:50
提供hashCode()
的有意義實現的任何對象都是地圖中的完美關鍵候選者:請參閱Understanding the workings of equals and hashCode in a HashMap。
另外,正如@Jon提到的,地圖中的所有鍵都應該是相同的類型。
編輯:當然,你需要實現都equals()
和hashcode()
。我認爲與其他問題鏈接的標題清楚地表明瞭這一點。但是一個愚蠢的執行hashcode()
只會帶給你一個退化的HashMap
,表現很差。
EDIT2:正如@Adrian在他的回答中提到的,泛型將幫助您約束地圖的鍵和值的類型。
參考文獻:
原始HashMap
確實會接受任何對象作爲重點。然而,良好的作風,以指定你要哪種鍵和值的地圖
Map<String, Whatever> map = new HashMap<String, Whatever>();
使用,如果你這樣做,put()
方法將只接受字符串。
NB:如果您選擇使用自己的類中的一個作爲密鑰,確保類要麼實現既equals
和hashCode
或沒有人!
鍵類型可以是任何類型,包括(對於某些用例)對象。唯一的技術要求是equals(Object)
和hashcode()
已正確實施所有類的實例可能被用作關鍵。實際上,您還希望的語義的equals(Object)
與所有可能的鍵類型/值的HashMap的預期行爲一致。
但是,如果您確實需要使用Object作爲鍵類型,那麼IdentityHashMap可能是更好的選擇。首先,它不使用equals(Object)
或hashcode()
,但使用==
和密鑰對象的「身份散列」值。
爲什麼你看到「String」經常用作散列鍵的一個可能原因是它是一個不可變的類
。
不可變對象作出巨大映射鍵,因爲一個不用擔心他們的價值觀
一旦他們在地圖中被修改或設置,這將破壞
地圖或設定的invaraints(第15項有效的Java,第二版)
此外,字符串有等於()內置 – 2014-10-21 23:13:01
我們一般在HashMap中使用String作爲鍵的原因之一是,由於String在Java中是不可變的,允許String緩存其哈希碼,因此不可變Java中的String緩存哈希碼,並且不會每次計算調用String的hashcode方法,這使得它像HashMap鍵一樣快。
是,但只有當我們使用相同的String實例再次訪問HashMap時,這不是因爲hashCode(),而是因爲equals()將兩個字符串的O(字符串的長度)時間相同,而不是同一個實例。 – kutschkem 2013-07-17 08:04:35
- 1. 字符串作爲hashmap中的鍵
- 2. 字符串數組作爲HashMap的鍵
- 3. HashMap字符串鍵
- 4. JList中使用的HashMap鍵(字符串)作爲其顯示?
- 5. KeyStroke類作爲HashMap中的一個鍵
- 6. 遍歷一個HashMap <String,字符串>鍵更改爲BigDecimal
- 7. 使用HashMap作爲另一個HashMap的關鍵字
- 8. 如何字符鍵轉換成字符串輸出一個HashMap
- 9. 在HashMap中使用長字符串鍵或短字符串鍵哪個更好?
- 10. ArrayList中的字符串用作HashMap中的鍵嗎?
- 11. 在HashMap中找不到字符串鍵
- 12. 生鏽的字符串鍵控HashMap?
- 13. 爲什麼我可以使用字符串作爲HashMap中的鍵?
- 14. ArrayList作爲Hashmap中的鍵
- 15. android.util.Pair作爲HashMap中的鍵
- 16. 製作一個HashMap,其鍵值爲HashSets
- 17. 的Django刪除其中有一個字符串作爲主鍵
- 18. EnumMap或HashMap如果查找鍵是一個字符串
- 19. 我如何使用hashmap鍵到一個字符串數組?
- 20. 的ArrayList <HashMap中<字符串,字符串>>爲String []
- 21. 如何解碼一個URL,並獲得查詢字符串作爲一個HashMap?
- 22. 爲什麼HashMap的被覆蓋現有的字符串鍵值
- 23. 詞典將不會更新爲一個字符串作爲鍵
- 24. 在kdb中存儲一個字符串作爲字符串
- 25. 我想這個字符串數組中的HashMap一樣鍵值形式安排
- 26. 在ArrayList中的HashMap <字符串,字符串>檢索從鍵/值值
- 27. 如何獲得一個表的鍵作爲字符串?
- 28. 搜索一個HashMap <字符串,ArrayList的<Users>>或HashMap中<字符串,HashSet的<Users>>
- 29. 二「」 splited字符串,分裂他們每個人對一個HashMap的鍵/值對
- 30. 字符串字符與多個值爲一個鍵
@Michael你怎麼知道這是一個Java問題? – 2009-12-13 11:02:22
你知道任何其他語言有'HashMap'類和'put()'方法,它需要Object作爲參數嗎? – BalusC 2009-12-14 17:44:11