代码之家  ›  专栏  ›  技术社区  ›  zzjbook

JAVA8中HashMap的性能

  •  3
  • zzjbook  · 技术社区  · 7 年前

    源代码这么复杂,效率有多高?

    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中显示结果 enter image description here

    我不明白为什么java8的性能会这么差

    我想学习java8中更好的HashMap,但我没有找到它。

    1 回复  |  直到 7 年前
        1
  •  6
  •   Stephen C    7 年前

    您的测试场景对于Java 8来说不是最佳的 HashMap . 哈希图 哈希图 更慢的。(速度比我预期的要慢……但这是另一个话题。)

    Test 要实现的类 Comparable<Test> …您应该看到,当哈希冲突的比例足够大时,Java 8的性能优于其他版本。


    注意,对于哈希函数不执行的情况,树优化应该被视为一种防御措施。优化转向 O(N) 最坏情况下的性能 O(logN) 最坏情况。

    如果你想要 哈希图 O(1) 查找时,应确保对键类型使用了良好的哈希函数。如果碰撞概率最小化,则优化是没有意义的。


    源代码这么复杂,效率有多高?

    源代码中的注释对此进行了解释。可能还有谷歌可以为你找到的其他地方:-)