Я знаю, что есть подобные сообщения по теме, но они не совсем затрагивают мой вопрос. Когда вы выполните:
Integer a = 10;
Integer b = 10;
System.out.println("a == b: " + (a == b));
Это будет (по-видимому) печатать true
большую часть времени, поскольку целые числа в диапазоне [-128, 127] как-то кэшируются. Но:
Integer a = new Integer(10);
Integer b = new Integer(10);
System.out.println("a == b: " + (a == b));
Вернет false
. Я понимаю, что я запрашиваю новые экземпляры Integer, но поскольку вложенные примитивы неизменны в Java, и механизм уже существует, чтобы делать "правильную вещь" (как видно в первом случае), почему это происходит?
Разве это не имело бы смысла, если бы все экземпляры Integer с 10 были одним и тем же объектом в памяти? Другими словами, почему у нас нет "Integer interning", который бы был похож на "String interning"?
Еще лучше, не было бы более разумным, если бы экземпляры примитива в штучной упаковке, представляющие одно и то же, независимо от значения (и типа), были бы одним и тем же объектом? Или, по крайней мере, правильно отредактировать ==
?