Ответ
Объект Integer занимает значительно больше памяти, чем примитив int, из-за накладных расходов JVM на хранение объекта.
Размер в памяти (для 64-битной JVM HotSpot с включенным сжатием ссылок - -XX:+UseCompressedOops, что используется по умолчанию):
- Заголовок объекта: 12 байт.
- Поле
valueтипаint: 4 байта. - Выравнивание (padding): 0 байт (итог кратен 8).
Итого: 16 байт на один объект Integer.
Сравнение:
int primitive = 42; // Занимает ровно 4 байта.
Integer object = Integer.valueOf(42); // Занимает ~16 байт.
Практические последствия:
- Использование
ArrayList<Integer>вместоint[]приводит к значительному увеличению потребления памяти и снижению производительности из-за дополнительных аллокаций и промахов кэша. - Автоупаковка (
int->Integer) в циклах создает множество временных объектов, что может вызвать нагрузку на сборщик мусора. - Для хранения больших объемов целочисленных данных предпочтительнее использовать примитивные массивы (
int[]) или специализированные коллекции (например, из библиотеки Eclipse Collections).