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

Java Integer.equals()和Objects.equals()的比较,java,testing,equals,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(int

以下是我对两种方法的测试:

    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");
当我替换这两种方法时:

    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");

所以,我的问题是:为什么在这两种情况下,第二个“测试”的执行速度都比第一个快得多?它依赖于什么?

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

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

请注意,您所测量的可能比equals()更随机


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

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

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

请注意,您所测量的可能比equals()更随机

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

    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