Сравните два целых числа: почему == верно?
Возможный дубликат:
Класс 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;