Являются ли классы-обёртки (Integer, Double, Boolean) в Java изменяемыми типами?

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

Ответ

Нет. Все классы-обёртки (Integer, Double, Boolean, Long, Character, Byte, Short, Float) в Java являются неизменяемыми (immutable).

Основные свойства:

  • Их внутреннее состояние (значение) устанавливается при создании и не может быть изменено.
  • Все поля объявлены как final.
  • Отсутствуют методы для модификации состояния.

Пример:

Integer a = 10;
a = 20; // Это не изменяет объект `a`. Создаётся новый объект `Integer(20)`, и ссылка `a` начинает указывать на него.

Почему они иммутабельны?

  1. Безопасность в многопоточности: Не требуют синхронизации.
  2. Кэширование: JVM кэширует часто используемые значения (например, Integer от -128 до 127), что экономит память.
  3. Надёжность: Могут безопасно использоваться как ключи в HashMap или элементы в HashSet.

Важно: Операции с обёртками (сложение, вычитание) также приводят к созданию новых объектов, что следует учитывать для производительности в критичных участках кода.