Классы-обертки (Wrapper Classes)
| English | Русский |
|---|---|
| wrapper class/ˈræpə klæs/ | класс-обертка |
| autoboxing/ˌɔːtəʊˈbɒksɪŋ/ | автоупаковкой |
| unboxing/ʌnˈbɒksɪŋ/ | распаковкой |
Обертывание примитива
- Некоторые структуры Java (например,
ArrayList) хранят объекты, а не примитивы. - Класс-обёртка оборачивает примитив в объект:
Integerоборачиваетint,Doubleоборачиваетdouble. Integer boxed = Integer.valueOf(5);помещаетint5внутрь объекта.- Обёртки позволяют примитивам существовать там, где разрешены только объекты.
Автоупаковка и распаковка
- Java преобразует автоматически — автоупаковка и распаковка.
Integer x = 5;упаковывает5;int y = x;распаковывает его обратно.- Поэтому
list.add(5)работает, хотя список содержит объектыInteger. - Вы редко пишете
Integer.valueOfвручную — это делает автоупаковка.
Почему ArrayList требует их
ArrayList<Integer>хранит объектыInteger, потому что обобщения требуют ссылочного типа.- Нельзя записать
ArrayList<int>— примитивы не являются объектами. - Автоупаковка позволяет удобно добавлять и считывать обычные
int. Double,Booleanи т.д. играют ту же роль для своих примитивов.
Сравнение обёрток с equals
- Два
Integerобъекта следует сравнивать с помощью.equals(), а не==. ==сравнивает ссылки;.equals()сравнивает обернутые значения.- (Java кэширует малые Integers, поэтому
==иногда кажется рабочим — не полагайтесь на это.) - То же правило «используйте
.equals()для объектов» изStringприменимо здесь.
Обёртки — это объекты, поэтому сравнивайте их значения через .equals(), а не ==. == проверяет идентичность ссылок; для двух объектов Integer с одинаковым значением он может быть false. И нельзя параметризовать коллекцию примитивом — это ArrayList<Integer>, никогда не ArrayList<int>. Автоупаковка устраняет разрыв, позволяя всё ещё добавлять обычные int.
Обёртки с ArrayList:
ArrayList<Integer> nums = new ArrayList<Integer>();nums.add(5);—int5автоматически упаковывается вInteger.int first = nums.get(0);—Integerавтоматически распаковывается обратно вint.
Класс-обёртка (Integer, Double, Boolean) оборачивает примитив в объект, чтобы он мог использоваться там, где требуются объекты — например, в ArrayList<Integer> (вы не можете записать ArrayList<int>). Автоупаковка и распаковка преобразуют автоматически. Сравнивайте объекты-обёртки через .equals(), а не ==.
Автоупаковка и распаковка (Autoboxing and unboxing)
Преобразования int ↔ Integer происходят автоматически.
Какой класс-обертка оборачивает int?
Integer оборачивает int; Double оборачивает double.
Почему ArrayList целых чисел должен быть объявлен как ArrayList
Нельзя написать ArrayList
Два объекта Integer следует сравнивать с помощью...
Обертки — это объекты; используйте .equals() для их значений.
В nums.add(5), int 5 автоматически упаковывается в Integer (автоупаковка).
Автоупаковка преобразует примитив в объект-обертку.
Класс, оборачивающий примитив в объект, называется классом-обёрткой (одно слово).
Integer, Double, Boolean — это классы-обёртки.