Немного подробнее о том, как работает автобокс и как кэшируются "малые" объекты Integer:
Когда примитив int автоматически помещается в Integer, компилятор делает это, заменяя код вызовом Integer.valueOf (...). Итак, следующее:
Integer a = 10;
заменяется компилятором на следующее:
Integer a = Integer.valueOf(10);
Метод valueOf (...) класса Integer поддерживает кэш, который содержит объекты Integer для всех значений от -127 до 128. Если вы вызываете valueOf (...) со значением, которое находится в этом диапазоне, метод возвращает предварительно существующий объект из кэша. Если значение выходит за пределы диапазона, возвращается новый объект Integer, инициализированный указанным значением. (Если вы хотите точно знать, как он работает, найдите файл src.zip в каталоге установки JDK и найдите в нем исходный код класса java.lang.Integer.)
Теперь, если вы сделаете это:
Integer a = 10;
Integer b = 10;
System.out.println(a == b);
вы увидите, что true напечатано - но не , потому что a и b имеют одно и то же значение, а потому что a и b ссылаются на один и тот же объект Integer, объект из кеша, возвращаемого Integer.valueOf (...).
Если вы измените значения:
Integer a = 200;
Integer b = 200;
System.out.println(a == b);
затем печатается false , потому что 200 находится вне диапазона кэша, и поэтому a и b относятся к двум разным объектам Integer.
К сожалению, == используется для равенства объектов для типов значений, таких как классы-оболочки и String в Java, - это нелогично.