gpt4 book ai didi

java - Java 对我的 "equals"实现做了什么?

转载 作者:行者123 更新时间:2023-11-30 05:58:19 24 4
gpt4 key购买 nike

今天,我偶然发现了以下问题:

考虑两个类 NewClass 和 NewClass1,它们具有以下“等于”方法:

新类:

@Override
public boolean equals(Object obj) {
return false;
}

public boolean equals(NewClass obj) {
return value == obj.getValue();
}

新类1:

@Override
public boolean equals(Object obj) {
if(!(obj instanceof NewClass1)) {
return false;
}
return equals((NewClass1) obj);
}

public boolean equals(NewClass1 obj) {
return value == obj.getValue();
}

我觉得奇怪的是,NewClass1 中的 equals 似乎比 NewClass 中的 equals 慢得多(10.000.000 次调用需要 14 毫秒,而 3000 毫秒)。起初,我认为这与“instanceof”检查有关,但如果我替换“return equals((NewClass1) obj);”与“返回错误;”在 NewClass1 中,突然间它的运行速度几乎相同。我真的不明白这里发生了什么,因为在我看来, equals(Object) 中的 return 语句实际上不应该被调用。我在这里犯了什么错?

以下是我的“基准测试代码”,以防我在那里犯了一些错误:

public static void main(String[] args) {
// TODO code application logic here

NewClass i1 = new NewClass(1);
NewClass i2 = new NewClass(1);
NewClass i3 = new NewClass(5);

NewClass1 j1 = new NewClass1(1);
NewClass1 j2 = new NewClass1(1);
NewClass1 j3 = new NewClass1(5);

Object o1 = new Object();
Object o2 = new Object();


assert(i1.equals(i1));
assert(i1.equals(i2));
assert(i1.equals(i3) == false);
assert(i1.equals(o1) == false);

assert(j1.equals(j1));
assert(j1.equals(j2));
assert(j1.equals(j3) == false);
assert(j1.equals(o1) == false);


long start = System.currentTimeMillis();

for(int i=0; i<1000000000; i++) {
i1.equals(i1);
i1.equals(i2);
i1.equals(o1);
i1.equals(o2);
}

long end = System.currentTimeMillis();

System.out.println("Execution time was "+(end-start)+" ms.");



start = System.currentTimeMillis();

for(int i=0; i<1000000000; i++) {
j1.equals(j1);
j1.equals(j2);
j1.equals(o1);
j1.equals(o2);
}

end = System.currentTimeMillis();

System.out.println("Execution time was "+(end-start)+" ms.");
}

最佳答案

我猜想是instanceof测试消耗了时间。当您将该方法中的最终返回更改为始终返回 false 时,编译器可能会消除条件,因为无论其评估如何,结果都将是相同的(返回 false)。这也可以解释为什么更改最终返回会产生任何影响,因为正如您所说,它实际上永远不会在代码路径中到达。

更一般地说,通过更改编译器优化代码的方式,代码更改即使不在执行的代码路径上也会影响性能。

关于java - Java 对我的 "equals"实现做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4439428/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com