Java с использованием Integer.parseInt для сравнения

Integer x1 = Integer.parseInt("4");
Integer y1 = Integer.parseInt("4");
Integer x2 = Integer.parseInt("444");
Integer y2 = Integer.parseInt("444");

System.out.println(x1==y1); // true
System.out.println(x2==y2); // false ???

Integer a1 = Integer.valueOf("4");
Integer b1 = Integer.valueOf("4");
Integer a2 = Integer.valueOf("444");
Integer b2 = Integer.valueOf("444");

System.out.println(a1==b1); // true
System.out.println(a2==b2); // false

Я понимаю, почему третий и четвертый вывод выводят true и false. Это связано с тем, что valueOf возвращает объект, а классы-оболочки кэшируют объекты со значениями в диапазоне от -128 до 127. Если valueOf передается любое значение в этом диапазоне, он должен повторно использовать объект в кэше. В противном случае будет создан новый объект.

Теперь, почему второй вывод выводит false? Я думал, что parseInt возвращает примитив, а не объект, как valueOf.


person George P. Burdell    schedule 31.07.2018    source источник
comment
потому что вы автоматически упаковываете его в Integer...   -  person Eugene    schedule 31.07.2018
comment
@TimBiegeleisen. Я не согласен, что это дубликат того. Это объясняет, что вы должны сравнивать .intValue() целочисленных объектов, а также дает дополнительную информацию об этом в целом. Но он не может ответить на фактический вопрос, заданный ОП. Поэтому я проголосовал за повторное открытие.   -  person Kevin Cruijssen    schedule 31.07.2018
comment
@KevinCruijssen Обратитесь к добавленной ссылке, в которой обсуждается пул констант Integer, которая объясняет приведенный выше вопрос. Об этом спрашивают снова и снова.   -  person Tim Biegeleisen    schedule 31.07.2018
comment
Как ответить на вопрос. В исходном коде Integer метод .valueOf выполняет следующие действия. : return new Integer(parseInt(s, 10, false));. Как видите, он использует .parseInt внутри и помещает его в Integer-конструктор для создания Integer-экземпляра. .parseInt действительно возвращает примитив: return parseInt(s, 10, false);. Однако, поскольку вы сохраняете его в поле Integer, происходит автоупаковка, которая неявно ведет себя примерно так же, как использование конструктора в методе .valueOf.   -  person Kevin Cruijssen    schedule 31.07.2018


Ответы (1)


Я думал, что parseInt возвращает примитив, а не объект, как это делает valueOf.

parseInt возвращает int, но вы присваиваете его переменной Integer, что приводит к автоматической упаковке. Поскольку int со значением 444 автоматически упаковывается два раза, каждый раз создается новый экземпляр Integer (поскольку для этого значения нельзя использовать кэш Integer), поэтому сравнение их с == возвращает false.

Если вы назначите вывод parseInt int, сравнения вернут true в обоих случаях:

int x1 = Integer.parseInt("4");
int y1 = Integer.parseInt("4");
int x2 = Integer.parseInt("444");
int y2 = Integer.parseInt("444");

System.out.println(x1==y1); // true
System.out.println(x2==y2); // true
person Eran    schedule 31.07.2018