Комментарии (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
- Часто лучше использовать примитивные типы для производительности