Целочисленное кеширование объектов - PullRequest
1 голос
/ 17 октября 2019

Я читал, что «Таким образом, при создании объекта с использованием Integer.valueOf или непосредственном присвоении значения Integer в диапазоне от -128 до 127 будет возвращен один и тот же объект».

Это причинапочему: -

Integer a=100;
Integer b=100;
if(a==b) // return true as both the objects are equal

Но почему бы не в этом случае ниже? Эти два значения также находятся в диапазоне 127 и -128, поэтому в соответствии с приведенным выше утверждением эти два также будут возвращать одни и те же объекты.

Но вывод, который я здесь получаю как "Не"

public static void main(String[] args) {

    Integer a = 10;
    Integer b = 12;
    if(a == b)
        System.out.println("same");
    else
        System.out.println("Not");
}

Может кто-нибудь объяснить?

Ответы [ 4 ]

2 голосов
/ 17 октября 2019

Вы не понимаете, что означает "тот же объект будет возвращен".

Таким образом, сравнение с == фактически сравнивает ячейки памяти и возвращает истину, только когда две переменные содержат один и тот же объект (т.е. хранятся в одной и той же ячейке памяти).

Значения между -От 128 до 127 хранятся в пуле целочисленных констант, что означает, что каждые 10 - это одни и те же 10 (т. Е. Одно и то же место в памяти), каждые 12 - это те же 12 и т. Д. Но это не , так как всеДесятки и двенадцатые - это то, что ваш вопрос непреднамеренно предполагает.

В любом случае, как только вы выходите за пределы этого диапазона, каждый примитив int является новым объектом и присваивается новой ячейке памяти за пределами пула констант. .

Это можно проверить с помощью следующего кода:

public static void main(String[] args) {

    Integer a = 1000;
    Integer b = 1000;
    if(a == b)
        System.out.println("same");
    else
        System.out.println("Not");
}

Это выведет «Not», потому что a и b - это два разных объекта, хранящихся в разных местах памяти.

И вот почему вы должны сравнивать вещи с .equals()

1 голос
/ 17 октября 2019

Если вы прочитаете фактический Java документ , вы увидите более четкое описание того, что он на самом деле делает

Возвращает экземпляр Integer, представляющий указанное значение типа int. Если новый экземпляр Integer не требуется, этот метод обычно следует использовать в предпочтении перед конструктором Integer (int), поскольку этот метод, вероятно, даст значительно лучшую производительность пространства и времени за счет кэширования часто запрашиваемых значений. Этот метод всегда будет кэшировать значения в диапазоне от -128 до 127 включительно и может кэшировать другие значения вне этого диапазона.

Поскольку возвращаемое целое число должно представлять указанное значение типа int, невозможноспособ, которым

Integer a = 10;
Integer b = 12;
System.out.println((a==b));

будет печатать "true", поскольку очевидно, что один и тот же объект не может представлять оба значения.

Редактировать:

Дляради точности - стандарт Java не требует, чтобы в автобоксе Integer (приписывая примитив int объекту Integer) использовался Integer.valueOf(), поэтому вполне возможно, что в соответствующей реализации Java

Integer a = 10;
Integer b = 10;
System.out.println((a==b));

выведет «false»;

1 голос
/ 17 октября 2019

== Проверяет, указывают ли обе ссылки на одну и ту же область памяти .
В первом случае оба значения одинаковы , поэтому ониуказывая на одно и то же местоположение только будет создан один объект .

Integer a=100;
Integer b=100;
if(a==b) // return true as both the objects are equal


Во втором случае оба значения различны, поэтому они имеют разные места в памяти для каждого, поэтому будут созданы два объекта .

public static void main(String[] args) {

    Integer a = 10;
    Integer b = 12;
    if(a == b)
        System.out.println("same");
    else
        System.out.println("Not");
}
0 голосов
/ 17 октября 2019

Просто они не являются одним и тем же объектом, это два разных экземпляра Integer для хранения заданного значения, так что если объект отличается, он всегда будет печатать Not

...