Java:什么更快?比较两个对象引用或比较两个原语?

时间:2018-04-12 03:13:08

标签: java

那么说默认equals(Object obj)

的逻辑是什么
public boolean equals(Object obj){
  this == obj; 
}

或:

int a = 1;
int b = 2;
a == b;

可能是另一种具有其他价值的类型,我只是找不到每种价格的文件。

  

添加原因:

我正在阅读this question我想,如果有一个优化来比较对象内部的值(如int)并比较它们而不是引用

1 个答案:

答案 0 :(得分:1)

写了一个小班(随意在你选择的编辑器中运行)..

public class HelloWorld {

    public static void main(String []args) {
        HelloWorld app = new HelloWorld();

        int n = 100000;

        long startTime = System.nanoTime();
        app.doEqualsNull(n);
        long endTime = System.nanoTime();
        System.out.println("doEqualsNull (ns): " + (endTime - startTime)) ; 

        startTime = System.nanoTime();
        app.doEqualsThis(n);
        endTime = System.nanoTime();
        System.out.println("doEqualsThis (ns): " + (endTime - startTime)) ;

        startTime = System.nanoTime();
        app.doEqualsSameInt(n);
        endTime = System.nanoTime();
        System.out.println("doEqualsSameInt (ns): " + (endTime - startTime)) ;

        startTime = System.nanoTime();
        app.doEqualsDifferentInt(n);
        endTime = System.nanoTime();
        System.out.println("doEqualsDifferentInt (ns): " + (endTime - startTime)) ;
    }

    public void doEqualsNull(int n) {
        for (int i = 0 ; i < n ; i++) {
            this.equals(null);
        }
    }

    public void doEqualsThis(int n) {
        for (int i = 0 ; i < n ; i++) {
            this.equals(this);
        }
    }

    public boolean equals(Object obj){
        return this == obj; 
    }

    public void doEqualsSameInt(int n) {
        for (int i = 0 ; i < n ; i++) {
            this.equalsInt(5);
        }
    }

    public void doEqualsDifferentInt(int n) {
        for (int i = 0 ; i < n ; i++) {
            this.equalsInt(50);
        }
    }

    public boolean equalsInt(int other){
        return 5 == other; 
    }
}

输出:

doEqualsNull (ns): 3660106
doEqualsThis (ns): 3237291
doEqualsSameInt (ns): 2887368
doEqualsDifferentInt (ns): 2992786

整数平等似乎需要稍微缩短的时间(这确实是一个非常小的差异) - 但是,我再次猜测一些分支预测确实对我的超级科学计算产生了影响。 :)