Integer.equals()和Objects.equals()的比较

时间:2015-06-22 15:07:30

标签: java testing equals

以下是我对两个等于方法的测试:

    Random generator = new Random();
    long startTime = System.nanoTime();
    for(int i = 0; i<1000; i++) {
        Integer int11 = generator.nextInt(1000);
        Integer int22 = generator.nextInt(1000);
        int11.equals(int22);            
    }
    long endTime = System.nanoTime();
    long duration = (endTime - startTime); 
    System.out.println(duration + " ns");

    Random generator1 = new Random();
    long startTime1 = System.nanoTime();
    for(int i = 0; i<1000; i++) {
        Integer int1 = generator1.nextInt(1000);
        Integer int2 = generator1.nextInt(1000);
        Objects.equals(int1, int2);
    }
    long endTime1 = System.nanoTime();
    long duration1 = (endTime1 - startTime1); 
    System.out.println(duration1 + " ns");

我只是想知道,Objects.equals()方法的速度有多慢,但我得到了以下输出:

1005750 ns
650554 ns

当我替换这两种方法时:

    Random generator1 = new Random();
    long startTime1 = System.nanoTime();
    for(int i = 0; i<1000; i++) {
        Integer int1 = generator1.nextInt(1000);
        Integer int2 = generator1.nextInt(1000);
        Objects.equals(int1, int2);
    }
    long endTime1 = System.nanoTime();
    long duration1 = (endTime1 - startTime1); 
    System.out.println(duration1 + " ns");

    Random generator = new Random();
    long startTime = System.nanoTime();
    for(int i = 0; i<1000; i++) {
        Integer int11 = generator.nextInt(1000);
        Integer int22 = generator.nextInt(1000);
        int11.equals(int22);            
    }
    long endTime = System.nanoTime();
    long duration = (endTime - startTime); 
    System.out.println(duration + " ns");

我得到与前一个非常相似的输出:

1026871 ns
614074 ns

所以,我的问题是:为什么第二个&#34;测试&#34;在两种情况下执行速度都比第一次快得多?它取决于什么?

1 个答案:

答案 0 :(得分:4)

因为JIT启动,并检测到Random.nextInt()equals()是两种经常被调用的方法,因此优化它们非常有用。

一旦优化了字节码并将其转换为本机代码,其执行速度就会更快。

请注意,您测量的内容可能比equals()更接近Random.nextInt()。

由于JIT完成运行时优化以及垃圾回收,正确的微基准测试在Java中很难做到。如果你想认真对待它,请使用JMH。