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

Comparasion of Integer.equals() and Objects.equals()

以下是我对两种 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

所以,我的问题是:为什么在这两种情况下,第二个 "test" 的执行速度都比第一个快得多?它取决于什么?

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

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

请注意,您测量的值可能 Random.nextInt() 多于 equals()。

由于 JIT 进行的运行时优化和垃圾收集,在 Java 中很难正确执行微基准测试。想认真点就用JMH