type -a PROG
для нахождения всех мест, где ПРОГР доступна, обычно где-нибудь в ~ / мусорное ведро, а не то в/usr/bin/PROG, который, возможно, ожидался.
Вот что делает метод equals:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
Как видите, здесь нет вычисления хэш-кода, но есть несколько других операций. Хотя x.intValue () == y.intValue ()
может быть немного быстрее, вы попадаете на территорию микрооптимизации. Кроме того, компилятор все равно может оптимизировать вызов equals ()
, хотя я не знаю этого наверняка.
Я бы обычно использовал примитив int
, но если бы мне пришлось используйте Integer
, я бы придерживался equals ()
.
if (x.equals (y))
Это похоже на дорогостоящую операцию. Вычисляются ли таким образом какие-либо хэш-коды?
Это не дорогая операция, и хеш-коды не вычисляются. Java не вычисляет хэш-коды волшебным образом, equals (...)
- это просто вызов метода, не отличающийся от любого другого вызова метода.
JVM, скорее всего, даже оптимизирует вызов метода (встраивание сравнение, которое происходит внутри метода), поэтому этот вызов не намного дороже, чем использование ==
для двух примитивных значений int
.
Примечание: не применяйте преждевременно микрооптимизации; ваши предположения типа «это должно быть медленно», скорее всего, неверны или не имеют значения, потому что код не является узким местом производительности.
Используйте метод равно
. Почему вы так переживаете, что это дорого?
Я бы выбрал x.equals (y), потому что это последовательный способ проверки равенства для всех классов.
Что касается производительности, то equals на самом деле дороже, потому что в конечном итоге вызывает intValue ().
EDIT: в большинстве случаев следует избегать автобокса. Это может сбить с толку, особенно автор не знает, что делает. Вы можете попробовать этот код, и вы будете удивлены результатом:
Integer a = 128;
Integer b = 128;
System.out.println(a==b);
"равно". Чтобы быть в безопасности, вы должны проверить отсутствие значения NULL:
x == y || (x != null && x.equals(y))
x == y проверяет значение null == null, которое, по ИМХО, должно быть истинным.
Код будет встроен JIT, если он вызывается достаточно часто, поэтому соображения производительности не должны иметь значения.
Конечно, лучше всего избегать целого числа в пользу простого типа int
.[Добавлено]
Кроме того, проверка на нуль необходима, чтобы гарантировать симметричность проверки равенства - x.equals (y) должен быть таким же, как y.equals (x), но не, если один из них нулевой.
Класс Integer реализует Comparable
, так что вы можете попробовать,
x.compareTo(y) == 0
также, если вместо равенства вы хотите сравнить эти целые числа, тогда,
x.compareTo (y) <0
сообщит вам, если x меньше y.
x.compareTo (y)> 0
сообщит вам, больше ли x, чем y.
] Конечно, в этих примерах было бы разумно убедиться, что x не равно нулю, прежде чем делать эти вызовы.