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

этот вопрос уже есть ответ здесь:

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

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

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

if (x == y) 

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

if (x.equals(y)) 

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

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

немного многословен...

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

9 ответов


это то, что делает метод 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().


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


if (x.equals(y))

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

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

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

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


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

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

EDIT: в большинстве случаев следует избегать автобоксинга. Это может быть очень запутанным, особенно автор не знает, что он делает. Вы можете попробовать этот код, и вы будете удивлены результатом;

Integer a = 128;
Integer b = 128;

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

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

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


"равных" это. Чтобы быть в безопасности, вы должны проверить на null-ness:

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

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

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

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

[добавлено]

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


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

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

}

класс Integer реализует Comparable<Integer>, Так что вы могли бы попробовать,

x.compareTo(y) == 0

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

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

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

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


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