簡體   English   中英

Java / HashMap /性能

[英]Java / HashMap / Performance

這是我的HashMap實現的put()方法。 100 000個元素的運行時間約為1500毫秒,而Collections的HashMap的運行時間為8毫秒。

是什么使性能如此巨大的差異?

(我的哈希函數只是基於hashCode(),負載系數約為0.6,因此它應該表現良好)

public boolean put(K key, V value)
{
    if (size > cap*LOAD_FACTOR) expand();

    int i;  
    for(i=hash(key);container[i] != null;i=(i+1) % cap)
    {
        if(container[i].key.equals(key))
        {
            container[i] = new Entry<K,V>(key,value);
            return true;
        }               
    }

    container[i] = new Entry<K,V>(key,value);
    size++;

    return true;

使用%是非常昂貴的操作,實際上HashMap並沒有全部使用它,即,它的大小始終是2的冪以允許遮罩完成任務。 在您的情況下,單個操作可以調用%多次,尤其是在您的負載系數不夠高的情況下。 嘗試刪除%

注意:如果您像以前一樣使用開放式尋址,則需要降低負載率,例如小於0.5。 HashMap具有更高的負載系數,因為它以不同的方式處理碰撞。

另請注意;

  • 創建一個新的媒體對象是非常昂貴的,我會在更新值時避免這種情況。
  • 您可以緩存hashCode以加快expand()的速度,這意味着您可以在執行equals()之前比較hashCode

暫無
暫無

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

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