當使用HashMap
時,對於元素檢索來說,速度對象類型有多重要?假設我使用循環來遍歷大型散列映射的可能鍵。什麼是我可以使用的最有效的密鑰類型?哈希映射中最有效的鍵對象類型?
截至目前,由於簡單起見,我使用了字符串作爲關鍵對象類型。在編碼的時候,這個問題突然出現在我的腦海中,激起我的好奇心。我試圖在網上搜索這個問題,但無法找到我正在尋找的答案。謝謝!
當使用HashMap
時,對於元素檢索來說,速度對象類型有多重要?假設我使用循環來遍歷大型散列映射的可能鍵。什麼是我可以使用的最有效的密鑰類型?哈希映射中最有效的鍵對象類型?
截至目前,由於簡單起見,我使用了字符串作爲關鍵對象類型。在編碼的時候,這個問題突然出現在我的腦海中,激起我的好奇心。我試圖在網上搜索這個問題,但無法找到我正在尋找的答案。謝謝!
散列圖會問你一個hashCode()
關鍵。如果生成散列碼所用的時間不合理,那麼這些對象的插入和檢索時間就會很長。以java.net.URL
爲例。這是哈希碼方法執行DNS查找。這樣的對象不會構成哈希映射的好鑰匙。
因爲沒有最好的鑰匙,所以沒有普遍的答案,哪個是最好的鑰匙。在散列圖中使用的最佳密鑰是您需要檢索的密鑰。只要確保密鑰的hashCode()
是快速的,並適當地使用int
的空間。
我討厭聽起來像一個四歲,但爲什麼是沒有最好的鑰匙?在對象類型無關緊要的較低級別中發生了什麼? – 2013-04-23 06:38:29
效率受hashCode和equals影響,正如這裏的一些答案所示。但是沒有最好的關鍵是你可能有使用哈希數據結構的理由。如果您已經有了一種您需要用來快速訪問數據的現有類型,那麼您將使用這種類型的密鑰:-) – Kirby 2013-04-23 06:40:56
對象類型與它的'hashCode()'無關緊要。哈希映射採用hashCode並將哈希函數應用於它。散列函數將hashCode從「int」空間減少到0 - > N之間的索引,其中N是用於存儲對象的數組的大小。最重要的是'hashCode' impl。 @Kirby已經解釋了我正在努力的一點。 – 2013-04-23 06:42:39
重要的是執行等於和hashCode方法。參見以下內容:What issues should be considered when overriding equals and hashCode in Java?
由於這些函數用於哈希運算,因此當您對集合進行操作時,它們的效率就會發揮作用。
一點題外話,牢記參考鏈接提出的觀點:
請確保你投入 集合的關鍵對象的hashCode()方法永遠不會改變,而對象是在集合。防彈的方式來保證這是讓你的鑰匙不可改變的,其中 也有其他好處。
重要的是你的情況下hashCode
方法的元素和equals
方法的速度。使用Integer
很好,因爲它們不需要對散列值進行任何特殊計算。字符串也是可以的,因爲散列值被內部緩存,雖然它們的執行速度比較慢,equals
。
主要hashCode()
和equals()
要快
hashCode()
應該是均勻分佈,以儘量減少散列衝突
2:請注意,java.util.HashMap的實現使用一些位混洗來確保密鑰均勻分佈,即使您的哈希碼不是那麼好。你仍然必須確定他們是不同的,雖然..也看到這個職位:http://stackoverflow.com/questions/2414117/explanation-of-hashmaphashint-method – rethab 2013-04-23 06:48:13
您是否試圖通過獲取方法或通過迭代方法從HashMap中檢索值?至於得到方法,上面的所有人都回答了這個問題。
如果您通過entrySet方法遍歷HashMap,則HashMap中的鍵類型無關緊要。此外,在每次迭代中手頭輸入entrySet,查找值變得毫無用處。還要注意,entrySet通常優於值方法和keySet方法,因爲它們都在內部使用entrySet迭代器並返回條目的鍵或值。
我不認爲在HashMap中的速度類型的關鍵問題。大小不重要對象類型。 – 2013-04-23 06:30:47
真的嗎?當你考慮它時,它似乎很重要。必須進行一些比較,檢查哈希映射中是否存在請求的密鑰。它可能尋找內存位置,還是以不同的方式工作?現在我很想知道。雖然,我確實相信你XD的解釋會很棒。 – 2013-04-23 06:33:51