Создание ссылок на разные объекты Integer
Допустим имеем подобный код на Java:
Integer A = 1000;
Integer B = 1000;
System.out.println(A == B);
В данном случае имеем две ссылки на объект A и B, в данном случае ссылки различны, ведут к разным адресам в памяти. Однако, если поменять код на:
Integer A = 100;
Integer B = 100;
System.out.println(A == B);
То получаем разные ссылки, но уже ведущие к одному адресу памяти. Как же так получается? При этом, если использовать такой код:
Integer A = new Integer(1000);
Integer B = new Integer(1000);
System.out.println(A == B);
То создаются опять же ссылки на разные адреса памяти. Но IDE подсвечивает конструктора new Integer() не совсем корректным, так как, начиная с 9 версии он является Deprecated. Соответсвенно сам вопрос: каким образом можно понять, как JVM выделит память для объекта, и можно ли где-то найти информацию по данной теме?
Ответы (1 шт):
JVM хранит кеш маленьких значений Integer от -128 до 127. Если вы создаете Integer из маленького значения int, то возвращается кешированный объект. Сделано для экономии памяти и немного ускоряет программу. Ситуация напоминает интернирование строк, только тут вы не можете интернировать произвольный Integer.
Сравните Integer A = 100; (компилятор выполняет автобоксинг и задействует кеш) и Integer A = new Integer(100); (всегда возвращает новый объект).