Подтвердить что ты не робот

Как сравнить два целых числа?

Мне нужно сравнить два объекта Integer (не int). Каков канонический способ их сравнения?

Integer x = ...
Integer y = ...

Я могу думать об этом:

if (x == y) 

Оператор == сравнивает только ссылки, поэтому это будет работать только для более низких целых значений. Но, возможно, авто-бокс в ногах...?

if (x.equals(y)) 

Это выглядит как дорогостоящая операция. Существуют ли какие-либо хэш-коды, рассчитанные таким образом?

if (x.intValue() == y.intValue())

Немного подробней...

EDIT: Благодарим за ваши ответы. Хотя я знаю, что делать сейчас, факты распространяются на все существующие ответы (даже на удаленные:):), и я действительно не знаю, какой из них принять. Поэтому я приму наилучший ответ, который касается всех трех возможностей сравнения или, по крайней мере, первых двух.

4b9b3361

Ответ 1

Это метод 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().

Ответ 2

Используйте метод equals. Почему вы так беспокоитесь, что это дорого?

Ответ 3

if (x.equals(y))

Это выглядит как дорогостоящая операция. Существуют ли какие-либо хэш-коды, рассчитанные таким образом?

Это не дорогостоящая операция, и не вычисляются никакие хеш-коды. Java не магически вычисляет хэш-коды, equals(...) - это всего лишь вызов метода, отличный от любого другого вызова метода.

JVM, скорее всего, даже оптимизирует вызов метода (вставляя сравнение, которое происходит внутри метода), поэтому этот вызов не намного дороже, чем использование == для двух примитивных значений int.

Примечание. Не допускайте преждевременного применения микрооптимизации; ваши предположения, подобные "это должно быть медленным", скорее всего, неверны или не имеют значения, потому что код не является узким местом производительности.

Ответ 4

Я бы пошел с x.equals(y), потому что этот согласованный способ проверить равенство для всех классов.

Что касается производительности, то равны на самом деле дороже, потому что она вызывает вызов intValue().

РЕДАКТИРОВАТЬ: вы должны избегать автобоксинга в большинстве случаев. Это может стать очень запутанным, особенно автор не знает, что он делает. Вы можете попробовать этот код, и вы будете удивлены результатом;

Integer a = 128;
Integer b = 128;

System.out.println(a==b);

Ответ 5

Незначительное примечание: поскольку Java 1.7 класс Integer имеет статический метод compare(Integer, Integer), поэтому вы можете просто вызвать Integer.compare(x, y) и выполнить его (вопросы об оптимизации в сторону).

Конечно, этот код несовместим с версиями Java до 1.7, поэтому я бы рекомендовал вместо этого использовать x.compareTo(y), совместимый с 1.2.

Ответ 6

"равно" это. Чтобы быть в безопасности, вы должны проверить нулевое значение:

x == y || (x != null && x.equals(y))

x == y тесты для null == null, которые IMHO должны быть истинными.

Код будет встроен JIT, если он вызван достаточно часто, поэтому соображения производительности не должны иметь значения.

Конечно, избегая "Integer" в пользу простого "int", это лучший способ, если вы можете.

[Добавлено]

Кроме того, нуль-проверка необходима, чтобы гарантировать, что тест равенства симметричен. x.equals(y) должен совпадать с y.equals(x), но не является, если один из них является нулевым.

Ответ 7

Сравните целое число и напечатайте его значение в порядке возрастания или убывания. Все, что вам нужно сделать, это реализовать интерфейс Comparator и переопределить его метод сравнения и сравнить его значение, как показано ниже:

@Override
public int compare(Integer o1, Integer o2) {
    if (ascending) {
        return o1.intValue() - o2.intValue();
    } else {
        return o2.intValue() - o1.intValue();
    }

}

Ответ 8

Класс Integer реализует Comparable<Integer>, поэтому вы можете попробовать,

x.compareTo(y) == 0

также, если вместо равенства вы ищете сравнение этих целых чисел, то

x.compareTo(y) < 0 расскажет вам, если x меньше y.

x.compareTo(y) > 0 расскажет вам, если x больше y.

Конечно, в этих примерах было бы разумно убедиться, что x не имеет значения null перед выполнением этих вызовов.

Ответ 9

Я просто столкнулся с этим в своем коде, и мне потребовалось некоторое время, чтобы понять это. Я делал пересечение двух отсортированных списков и получал только небольшие числа в моем выпуске. Я мог бы заставить его работать, используя (x - y == 0) вместо (x == y) во время сравнения.