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
.
Integer
... - person Eugene   schedule 31.07.2018.intValue()
целочисленных объектов, а также дает дополнительную информацию об этом в целом. Но он не может ответить на фактический вопрос, заданный ОП. Поэтому я проголосовал за повторное открытие. - person Kevin Cruijssen   schedule 31.07.2018Integer
метод.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