Получить доступ

Чем int[] на миллион чисел выгоднее List<Integer> того же размера?

MiddleОсновы языка
Коротко

int[] — сплошной блок ~4 МБ. List<Integer> — миллион отдельных объектов Integer (16 байт каждый) плюс массив ссылок: в 4–5 раз больше памяти, нагрузка на GC и промахи кэша при обходе.

  • Каждая упаковка вне кэша −128…127 — аллокация
  • Примитивные стримы: IntStream вместо Stream<Integer>
  • Библиотеки примитивных коллекций: fastutil, Eclipse Collections

А ещё Valhalla (value-классы) должна снять проблему

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Попробуйте сами

Песочница: == против equals и кэш Integer

Подробно

Каждый бокс — это аллокация объекта в куче и лишняя косвенность. На больших структурах это бьёт по памяти и скорости. Поэтому в перфо-чувствительном коде берут примитивные массивы вместо List<Integer> и специализированные потоки (IntStream/LongStream/DoubleStream) вместо Stream<Integer> — они не боксят элементы. Integer-кэш покрывает только -128..127, на больших значениях не помогает.

Что хотят услышать

  • Размещение в памяти.
  • Последствия для GC и кэша.
  • Альтернативы.

Частые ошибки

  • Полагать, что JIT уберёт боксинг из List<Integer>.
  • Рассчитывать на Integer cache для произвольных значений.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓int[] — сплошной блок ~4 МБ без боксинга; List<Integer> хранит миллион отдельных объектов Integer (заголовок ~16 байт каждый) плюс массив ссылок — кратно больше памяти и промахи кэша при обходе
  • ✗Разницы нет: JIT всё равно разбоксит List<Integer> в массив примитивов
  • ✗List<Integer> быстрее, потому что Integer кэшируется для всех значений
  • ✗int[] медленнее: примитивы хранятся в куче по одному объекту

Что спросят дальше

  • Чем IntStream лучше Stream<Integer>?
  • Когда удобство List<Integer> важнее экономии памяти?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем