Целое число == int разрешено в Java - PullRequest
5 голосов
/ 06 октября 2011

Мне было интересно, превращает ли java автоматически целое число в int по сравнению с int?Или == попробует сравнить ссылки на примитивы?

Всегда ли это так или мне нужно сделать i.intValue()==2?

Integer i = Integer.valueOf(2);
if (i==2){
//always?
}

Ответы [ 6 ]

11 голосов
/ 06 октября 2011

Да, при сравнении 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
4 голосов
/ 06 октября 2011

Да, он будет распакован.Это рассматривается в разделе 15.21.1 JLS (числовой оператор ==):

Если оба операнда оператора равенства имеют числовой тип или одинчислового типа, а другой преобразуется ( §5.1.8 ) в числовой тип, двоичное числовое продвижение выполняется над операндами (§5.6.2).Если повышенный тип операндов - int или long, то выполняется тест на целочисленное равенство;если повышенный тип является плавающим или двойным, то выполняется тест на равенство с плавающей запятой.

Обратите внимание, что двоичное числовое продвижение выполняет преобразование набора значений (§5.1.13) и преобразование распаковки ( §5.1.8 ).

(я связал раздел 5.1.8, так как это то, что говорит о доступном преобразовании из Integer в int.)

2 голосов
/ 06 октября 2011

да, он автоматически конвертируется.Вы также можете сделать

Integer i = 2;
2 голосов
/ 06 октября 2011

Это возможно.

Эта Java-функция называется Автобокс .

1 голос
/ 06 октября 2011

Будет сравниваться примитивы - Integer будет распакован. Но, как правило, избегайте этого. Всегда предпочитайте примитивы и будьте осторожны при сравнении объектов с ==

Помимо просмотра этого в JLS , вот как вы можете это проверить:

Вместо Integer.valueOf(2), который использует кеш, используйте new Integer(2). Это гарантированно будет другой экземпляр, чем тот, который будет получен, если 2 в штучной упаковке (бокс происходит с Integer.valueOf(..)). В этом случае условие все еще выполняется, что означает, что сравниваются не ссылки.

1 голос
/ 06 октября 2011

Да, это работает, потому что автоматический (un) бокс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...