Что работает быстрее в Java: примитивные типы или их объектные обёртки (например, int vs Integer) и почему?

«Что работает быстрее в Java: примитивные типы или их объектные обёртки (например, int vs Integer) и почему?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Примитивные типы (int, long, boolean и т.д.) работают быстрее, чем их объектные обёртки (Integer, Long, Boolean).

Причины производительности:

  1. Расположение в памяти: Примитивы хранятся в стеке (stack), что обеспечивает быстрый доступ. Объекты хранятся в куче (heap), что требует дополнительного времени для выделения памяти и управления ссылками.
  2. Отсутствие накладных расходов: У примитивов нет оверхеда на создание объекта, заголовка объекта и сборку мусора.
  3. Прямой доступ: Работа идёт непосредственно со значением, а не с ссылкой на объект.
  4. Автоупаковка/распаковка: Использование обёрток часто приводит к неявным преобразованиям, которые создают временные объекты.

Пример, демонстрирующий разницу:

// Быстрее: операции с примитивами
int a = 10;
int b = 20;
int sum = a + b;

// Медленнее: операции с обёртками (происходит автоупаковка/распаковка)
Integer x = 10; // Автоупаковка: Integer.valueOf(10)
Integer y = 20; // Автоупаковка
Integer sumObj = x + y; // Распаковка, сложение, упаковка результата

Важно: В современных JVM с мощными оптимизациями (например, escape analysis) эта разница в некоторых сценариях может быть минимальной, но принципиальное преимущество примитивов остаётся.