Сравните два целых числа: почему == верно?

Возможный дубликат:
Класс Wrapper и оператор ==

Привет, когда я сравниваю Integer с == У меня есть некоторые проблемы, так что вы можете объяснить мне, почему второй тест тоже успешен?

@Test
public void integerTest() {
    Integer prvni = 127;
    Integer druhy = 127;
    Integer treti = 128;
    Integer ctvrty = 128;

    assertTrue(prvni == druhy);
    assertTrue(treti != ctvrty);

}

3 ответа

Решение

Когда используешь == чтобы сравнить объекты, вы фактически сравниваете ссылки. Т.е. причина, по которой оба утверждения верны, состоит в том, что prvni а также druhy ссылаются на тот же объект, в то время как treti а также ctvrty не.

Это потому что JVM кеширует Integer объекты в диапазоне от -128 до 127, и повторно использует кэшированные объекты при автобоксировании значений.

Если вы не переключитесь на int вместо этого вы могли бы пройти prvni.intValue() или использовать prvni.equals(...) вместо.

Начиная с Java 1.5, некоторые из классов-оболочек ввели кеш. За Integerлюбое число от -128 до 127 включительно попадало в кеш. Другие значения должны быть обернуты в new Integer каждый раз.

== Оператор сравнивает ссылки. Поскольку кешированные значения Integer для 127 на самом деле являются одним и тем же объектом, == возвращается true, Для 128 Integer объекты, это два разных объекта и не имеют одинакового ссылочного равенства.

Есть два более надежных способа сравнения:

if (treti.equals(ctvrty)) { /* do something */ }

или же:

if (treti.compareTo(ctvrty) == 0) { /* do something */ }

Последнее сравнение использует тот факт, что Integer реализует Comparable интерфейс и, таким образом, определяет compareTo метод, который возвращает отрицательное значение, если первый объект "меньше" второго, положительное значение, если первый объект "больше" второго, и ноль, если объекты сравниваются равными.

Функция автобокс создает новый экземпляр для каждого объекта.

попробуй это:

int treti = 128;
int ctvrty = 128;
Другие вопросы по тегам