Сегодня я наткнулся на следующее:
Рассмотрим два класса NewClass и NewClass1, которые имеют следующие методы "равно":
NewClass:
@Override
public boolean equals(Object obj) {
return false;
}
public boolean equals(NewClass obj) {
return value == obj.getValue();
}
NewClass1:
@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 кажутся экспоненциально медленнее, чем в NewClass (для 10.000.000 вызовов 14мс против 3000мс).Сначала я думал, что это связано с проверкой instanceof, но если я заменю «return equals ((NewClass1) obj);»с "вернем ложь";в NewClass1 внезапно он работает более или менее одинаково быстро.Я не очень понимаю, что здесь происходит, потому что, по моему мнению, оператор return в equals (Object) никогда не должен вызываться.Что я тут не так делаю?
Ниже приведен мой «код для тестирования», если я допустил ошибку:
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.");
}