簡體   English   中英

hashMap 的內部實現

[英]Internal implementation of hashMap

我了解 hashMap 內部實現,我需要一些關於相同的幫助。 HashMap 在 java 8 中使用鏈表存儲數據,它使用樹數據結構。 下面是節點 Node 類構造函數,你能幫我理解為什么節點具有鍵的哈希值嗎?

Node(int hash, K key, V value, Node<K,V> next) {
            this.hash = hash;
            this.key = key;
            this.value = value;
            this.next = next;
        }

您使用散列來計算元素在 HashMap 中的位置。 如果每次需要 解決沖突時向 HashMap 添加鍵都需要重新計算散列,那將是極其低效的。 不僅如此,某些對象可能具有昂貴的哈希函數(例如,String hashCode遍歷 String 中的每個字符)。 它總是需要計算這樣的功能,一旦和緩存,以備日后(因為你應該不會改變的hashCode /對於放置在地圖中的對象等於)。

讓我們考慮一個半滿 ( n/2 ) 的 HashMap,將獨立元素放入條目集中。 添加的任何給定元素都有1/2的碰撞概率(最小)。 可以填充 HashMap 的條目數量是n ,但默認加載因子是 0.75,這意味着我們還有3n/4 - n/2 = n/4個條目需要填充。 所有這些條目都必須沒有哈希沖突,因為我們可以為每次沖突節省時間(通過緩存)。 假設不發生沖突的最大可能概率為1/2 ,我們看到在 HashMap 擴展之前沒有發生沖突的概率為1/2 n/4 這意味着對於任何大小的 HashMap( n=29+ ,其中只需要填充 0.5*29=(約 15) 個鍵),有超過 99% 的機會從緩存哈希值中節省時間.

tl;dr 它可以節省時間,尤其是當添加/查找沖突變得頻繁時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM