Да, при сравнении int
с использованием ==
аргументы будут распакованы при необходимости.
Соответствующий раздел из Спецификации языка Java :
15.21.1 Операторы числового равенства == и! =
Если оба операнда оператора равенства имеют числовой тип или один имеет числовой тип, а другой может быть преобразован (§5.1.8) в числовой тип, двоичные числовые преобразования выполняются над операндами (§5.6.2) ). Если повышенный тип операндов - int или long, то выполняется тест на целочисленное равенство; если повышенный тип является float или double, то выполняется тест на равенство с плавающей точкой.
Обратите внимание, что двоичное числовое продвижение выполняет преобразование набора значений (§5.1.13) и преобразование распаковки (§5.1.8) . Сравнение выполняется точно по значениям с плавающей точкой, независимо от того, из каких наборов значений были получены их представляющие значения.
То же самое относится к <
, <=
, >
, >=
и т. Д., А также +
, -
, *
и т. Д.
Итак,
System.out.println(Integer.valueOf(17) == 17);
отпечатков true
: -)
но вы можете сравнить две одинаковые строки с == и иногда получить значение true или fals в зависимости от того, как были объединены строки ...
Точно, и на самом деле аналогичная ситуация наблюдается и для Integers
.
При упаковке (с преобразованием int
в Integer
) компилятор использует кэш для небольших значений (-128 - 127) и повторно использует одни и те же объекты для тех же значений, поэтому, возможно, немного удивительно, мы имеем следующее:
System.out.println(Integer.valueOf(100) == Integer.valueOf(100)); // prints true
System.out.println(Integer.valueOf(200) == Integer.valueOf(200)); // prints false