Т.Л., др мое мнение заключается в использовании одинарного +
для запуска распаковки на одном из операндов при проверке на значение равенства, а просто использовать математику операторов в противном случае. Обоснование следует следующим образом:
Уже упоминалось, что сравнение для сравнения Integer
- это сравнение идентичности, которое обычно не то, что хочет программист, и что целью является сравнение значений; Тем не менее, я сделал немного science о том, как сделать это сравнение наиболее эффективно, как с точки зрения компактности, правильности и скорости кода.
я использовал обычную кучу методов:
public boolean method1() {
Integer i1 = 7, i2 = 5;
return i1.equals(i2);
}
public boolean method2() {
Integer i1 = 7, i2 = 5;
return i1.intValue() == i2.intValue();
}
public boolean method3() {
Integer i1 = 7, i2 = 5;
return i1.intValue() == i2;
}
public boolean method4() {
Integer i1 = 7, i2 = 5;
return i1 == +i2;
}
public boolean method5() { // obviously not what we want..
Integer i1 = 7, i2 = 5;
return i1 == i2;
}
и получил этот код после компиляции и декомпиляции:
public boolean method1() {
Integer var1 = Integer.valueOf(7);
Integer var2 = Integer.valueOf(5);
return var1.equals(var2);
}
public boolean method2() {
Integer var1 = Integer.valueOf(7);
Integer var2 = Integer.valueOf(5);
if (var2.intValue() == var1.intValue()) {
return true;
} else {
return false;
}
}
public boolean method3() {
Integer var1 = Integer.valueOf(7);
Integer var2 = Integer.valueOf(5);
if (var2.intValue() == var1.intValue()) {
return true;
} else {
return false;
}
}
public boolean method4() {
Integer var1 = Integer.valueOf(7);
Integer var2 = Integer.valueOf(5);
if (var2.intValue() == var1.intValue()) {
return true;
} else {
return false;
}
}
public boolean method5() {
Integer var1 = Integer.valueOf(7);
Integer var2 = Integer.valueOf(5);
if (var2 == var1) {
return true;
} else {
return false;
}
}
Как вы можете легко увидеть, метод 1 вызывает Integer.equals()
(очевидно), методы 2-4 приводят к точно такой же код, разворачивая значения с помощью .intValue()
, а затем сравнивая их напрямую, а метод 5 просто запускает сравнение идентичности, являясь неправильным способом сравнения значений.
Поскольку (как уже было упомянуто, например, JS) equals()
несет накладные расходы (он должен делать instanceof
и неконтролируемый бросок), методы 2-4 будет работать с точно такой же скоростью, noticingly лучше, чем метод 1 при использовании в жесткой петли, поскольку HotSpot вряд ли оптимизирует отливки & instanceof
.
Это очень похоже с другими операторами сравнения (например, <
/>
) - они будут вызывать распаковка, при использовании compareTo()
не будут - но на этот раз, операция является весьма оптимизируемым по ГВ, так как intValue()
просто метод геттера (прайм кандидата на оптимизацию).
На мой взгляд, редко используется версия 4 является самым кратким образом - каждый заправленный C/Java разработчик знает, что унарный плюс в большинстве случаев равна приведение к int
/.intValue()
- в то время как это может быть немного WTF момент для некоторых (в основном тех, кто не использовал унарный плюс в своей жизни), он, возможно, показывает намерение наиболее четко и наименее - он показывает, что нам нужно значение int
одного из операндов, заставляя другое значение распаковываться как Что ж. Также неоспоримо наиболее похожа на обычную i1 == i2
сравнения используется для примитивных int
значений.
Мой голос идет на i1 == +i2
& i1 > i2
стиль для Integer
объектов, как по соображениям производительности & консистенции. Он также переносит код в примитивы, не изменяя ничего, кроме объявления типа. Использование названных методов похоже на введение семантического шума для меня, похоже на сильно критикуемый стиль bigInt.add(10).multiply(-3)
.
Ну, что случилось, когда вы пробовали? Что вы наблюдали? –
@Bart Kiers: Явный эксперимент может только опровергнуть, а не доказывать, что происходит распаковка. Если использование '==' вместо 'equals' дает правильный результат, это может быть из-за того, что помещенные в номера номера интернированы или используются иным образом (как, например, оптимизация компилятора). Причина этого вопроса заключается в том, чтобы выяснить, что происходит внутри страны, а не то, что происходит. (По крайней мере, вот почему я здесь.) –