簡體   English   中英

JAVA8中HashMap的性能

[英]The performance of the HashMap in JAVA8

我在java8中學習了HashMap源代碼時遇到了一個問題。

源代碼是如此復雜,效率有多大?

所以我寫了一個關於哈希沖突的代碼。

public class Test {             
    final int i;            

    public Test(int i) {            
        this.i = i;     
    }           

    public static void main(String[] args) {            
        java.util.HashMap<Test, Test> set = new java.util.HashMap<Test, Test>();        
        long time;      
        Test last;      
        Random random = new Random(0);      
        int i = 0;      
        for (int max = 1; max < 200000; max <<= 1) {        
            long c1 = 0, c2 = 0;    
            int t = 0;  
            for (; i < max; i++, t++) { 
                last = new Test(random.nextInt());
                time = System.nanoTime();
                set.put(last, last);
                c1 += (System.nanoTime() - time);
                last = new Test(random.nextInt());
                time = System.nanoTime();
                set.get(last);
                c2 += (System.nanoTime() - time);
            }   
            System.out.format("%d\t%d\t%d\n", max, (c1 / t), (c2 / t)); 
        }       
    }           

    public int hashCode() {         
        return 0;       
    }           

    public boolean equals(Object obj) {         
        if (obj == null)        
            return false;   
        if (!(obj instanceof Test))     
            return false;   
        Test t = (Test) obj;        
        return t.i == this.i;       
    }           
}

我在Excel中顯示結果。 在此處輸入圖像描述

我使用java6u45 java7u80 java8u131。

我不明白為什么java8的性能會如此糟糕

我正在嘗試編寫自己的HashMap。

我想在java8中學習HashMap哪個更好,但是我找不到它。

您的測試場景對於Java 8 HashMap來說不是最佳的。 Java 8中的HashMap通過對任何長度超過給定閾值的哈希鏈使用二叉樹來優化沖突。 但是,這僅在密鑰類型具有可比性時才有效。 如果不是那么測試的開銷實際上使得Java 8 HashMap變得更慢。 (減速比我預期的要多......但這是另一個話題。)

更改您的Test類以實現Comparable<Test> ...並且您應該看到當哈希沖突的比例足夠大時,Java 8的性能優於其他Java。


請注意,樹優化應被視為散列函數不執行的情況下的防御措施。 優化將O(N)最壞情況性能轉化為O(logN)最壞情況。

如果希望HashMap實例具有O(1)查找,則應確保對密鑰類型使用良好的哈希函數。 如果碰撞概率最小化,則優化沒有實際意義。


源代碼是如此復雜,效率有多大?

它在源代碼的注釋中進行了解釋。 也許Google可以為您找到的其他地方:-)

暫無
暫無

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

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