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

type -a PROG

для нахождения всех мест, где ПРОГР доступна, обычно где-нибудь в ~ / мусорное ведро, а не то в/usr/bin/PROG, который, возможно, ожидался.

34
задан Daniel Rikowski 20 March 2015 в 14:26
поделиться

6 ответов

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

33
ответ дан 27 November 2019 в 16:12
поделиться
 if (x.equals (y))

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

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

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

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

13
ответ дан 27 November 2019 в 16:12
поделиться

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

26
ответ дан 27 November 2019 в 16:12
поделиться

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

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

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

Integer a = 128;
Integer b = 128;

System.out.println(a==b);
8
ответ дан 27 November 2019 в 16:12
поделиться

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

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

x == y проверяет значение null == null, которое, по ИМХО, должно быть истинным.

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

Конечно, лучше всего избегать целого числа в пользу простого типа int

.

[Добавлено]

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

2
ответ дан 27 November 2019 в 16:12
поделиться

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

x.compareTo(y) == 0

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

x.compareTo (y) <0 сообщит вам, если x меньше y.

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

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

1
ответ дан 27 November 2019 в 16:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: