← Назад к вопросам

Какие классы-обертки знаешь

1.3 Junior🔥 131 комментариев
#ООП#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Классы-обёртки в Java

Классы-обёртки (Wrapper Classes) - это объектные аналоги примитивных типов. Каждому примитивному типу соответствует свой wrapper класс.

Основные типы

// Соответствие примитив -> wrapper
byte -> Byte
short -> Short
int -> Integer
long -> Long
float -> Float
double -> Double
boolean -> Boolean
char -> Character

Все wrapper классы (кроме Boolean и Character) наследуют класс Number, который предоставляет методы для преобразования между числовыми типами.

Автоупаковка и распаковка

// Автоупаковка (autoboxing) - преобразование примитива в объект
Integer boxed = 42;  // автоматически Integer.valueOf(42)
List<Integer> list = new ArrayList<>();
list.add(10);  // 10 упаковывается в Integer

// Автораспаковка (unboxing) - преобразование объекта в примитив
int unboxed = boxed;  // автоматически boxed.intValue()
int value = list.get(0);  // Integer распаковывается в int

Кэширование значений

Java кэширует Integer от -128 до 127 для оптимизации памяти:

Integer a = 127;
Integer b = 127;
System.out.println(a == b);  // true - из кэша

Integer c = 128;
Integer d = 128;
System.out.println(c == d);  // false - разные объекты

// Также кэшируются: Byte, Short, Long в этом же диапазоне
// Double и Float НЕ кэшируются

Правило: всегда используй equals() для сравнения wrapper объектов, не ==.

Частые методы

// Преобразование
Integer val = Integer.valueOf("42");  // String -> Integer
int prim = Integer.parseInt("42");    // String -> int
String str = Integer.toString(42);    // int -> String

// Полезные операции
Integer.max(10, 20);      // 20
Integer.min(10, 20);      // 10
Integer.compare(10, 20);  // -1
Integer.bitCount(42);     // количество единиц в бинарном виде

// Константы
Integer.MAX_VALUE;        // 2147483647
Integer.MIN_VALUE;        // -2147483648

// Для Double
Double d = 3.14;
d.isInfinite();           // проверка на бесконечность
d.isNaN();                // проверка на NaN

// Для Character
Character.isUpperCase('A');   // true
Character.isDigit('5');       // true
Character.toUpperCase('a');   // 'A'

Основное применение - коллекции и дженерики

// Примитивы не могут использоваться в дженериках
List<Integer> numbers = new ArrayList<>();  // правильно
// List<int> numbers;  // ошибка!

Set<Double> values = new HashSet<>();
Map<String, Long> mapping = new HashMap<>();

// Stream API требует wrapper типов для reference типов
numbers.stream()
    .filter(n -> n > 10)
    .map(n -> n * 2)
    .collect(Collectors.toList());

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

// ОШИБКА 1: NullPointerException при распаковке
Integer boxedNull = null;
// int value = boxedNull;  // NPE!
int value = boxedNull != null ? boxedNull : 0;  // правильно

// ОШИБКА 2: использование == вместо equals()
Integer a = 1000;
Integer b = 1000;
if (a == b) { }  // может быть false!
if (a.equals(b)) { }  // правильно

// ОШИБКА 3: производительность при частой упаковке
for (int i = 0; i < 1_000_000; i++) {
    Integer boxed = i;  // создаёт миллион объектов
}

Заключение

Wrappers - это необходимость Java для использования примитивов в объектных контекстах. Главное помнить:

  • Используй equals(), не ==
  • Остерегайся NullPointerException при распаковке null
  • Кэширование работает только для -128 до 127
  • Часто лучше использовать примитивные типы для производительности