-
どうしたの
autoboxing
?オートボクシングは
byte
、ラッパー クラス (Byte、Short、Character、Integer、Long、Float、Double) のオブジェクトを、対応する元のプリミティブ型 (それぞれ、、、、、、、、、、、 )short
の値で暗黙的に初期化するメカニズムですchar
。クラス コンストラクターの明示的な使用。int
long
float
double
オートボックス化は、プリミティブがラッパー クラスに直接割り当てられるとき ("
=
" 演算子を使用)、またはプリミティブがメソッドのパラメーター (「ラッパー クラス」など) に渡されるときに発生します。プリミティブ型の変数とコンパイル時定数 (リテラルとfinal
-プリミティブ) の両方を「ラッパー クラス」に自動パックできます。この場合、元のプリミティブ型の変数を初期化するには、リテラルが構文的に正しい必要があります。プリミティブ型の変数のオートボックス化には、元のプリミティブの型、つまり「ラッパー クラス」の型が完全に一致する必要があります。たとえば、最初に明示的なキャストを行わずに型変数
byte
を にオートボックス化しようとすると、コンパイル エラーが発生します。Short
byte->short
プリミティブ型定数のオートボックス化により、より広い一致境界が可能になります。この場合、コンパイラはプリミティブ型の暗黙的な拡張/絞り込みを事前に実行できます。変換は 2 つの段階で行われます。
-
元のプリミティブ型をラッパー クラスに対応するプリミティブ型に暗黙的に拡張 (絞り込み) (変換の場合
int->Byte
、コンパイラは最初に暗黙的int
に に絞り込みますbyte
) -
プリミティブを適切な「ラッパー クラス」に自動パッキングします (コンパイラー autopacks
byte->Byte
)。ただし、この場合、追加の制限が 2 つあります。 -
「ラッパー」へのプリミティブの代入は、「
=
」演算子を使用してのみ行うことができます (明示的な型キャストを行わないと、このようなプリミティブをメソッド パラメーターに渡すことはできません)。 -
左側のオペランドの型は よりも古いものであってはならず
Character
、右側のオペランドの型は よりも古いものであってはなりませんint
(拡張/縮小は 、 、縮小のみが許可されますbyte <-> short
。byte <-> char
他short <-> char
のbyte <- int
すべてshort <- int
のchar <- int
オプションには明示的な型キャストが必要です)。
-128 +127 の範囲のオートボクシング定数によって作成される整数「ラッパー クラス」の追加機能は、それらが JVM によってキャッシュされることです。したがって、同じ値を持つそのようなラッパーは 1 つのオブジェクトへの参照になります。
-
-
なぜ使われるのでしょうか
autoboxing
?講演内容を引用させていただきます。
覚えているとおり、Java にはクラスから継承された型
Object
とプリミティブ型の両方があります。しかし、結局のところ、コレクションやジェネリックのような便利なものは、 から継承された型でのみ機能しますObject
。 -
代替案
autoboxing
?Не нашел ответа, но запостил на StackOverFlow.
Исходя из этой дискуссии, получается, что альтернатива
autoboxing
`у это использование примитивных типов, так How использовниеautoboxing
`a снижает производительность. Вывод: использоватьautoboxing
только там где это необходимо.Написана статья про
Autoboxing
: Autoboxing: Traps and Advantages -
Типы-обертки для примитивных типов
mutable
orimmutable
?Immutable
, так How примитивные an objectы тожеimmutable
. Whatбы работать How сMutable
типом есть классMutableInteger
, и.т.д. -
Как примитивные типы приводятся к непримитивным аналогам?
На этот и последующий вопросы хорошо отвечает вот эта статья: Автоупаковка и распаковка в Java
Это заключение из нее: автоупаковка является механизмом для скрытого преобразования примитивных типов данных в соответствующие классы-оболочки (an objectы). Компилятор использует метод
valueOf()
чтобы преобразовать примитивные типы в an objectы, а методыIntValue()
,doubleValue()
и т.д., чтобы получить примитивные типы из an object (то есть обратное преобразование). Автоупаковка преобразует логический типboolean
вBoolean
,byte
вByte
,char
вCharacter
,float
вFloat
,int
вInteger
,long
вLong
,short
вShort
. Распаковка происходит в обратном направлении. -
Как непримитивные типы приводятся к примитивным?
Выше ответил.
-
Как сравниваются примитивные и непримитивные типы?
В лекции это подробно рассматривается, но я нашел так скажем тоже самое, но другими словами.
В Java есть два способа сравнивать an objectы на equalsство,
==
и методequals()
.==
используется для примитивных типов. Для an objectов «==
» это исключительно сравнение ссылок. Для остальных случаев нужно использовать методequals()
. Кроме того методhashCode()
служит (в теории) для той же цели. Хорошим тоном считается, если вы переопределorequals()
иhashCode()
. После инициализации неких an objectов a и b должно выполняться правило:Если выражение
a.equals(b)
вернет true, тоa.hashCode()
должен быть equalsb.hashCode()
. -
Всегда ли создается новый an object при операции
autoboxing
?Это в лекциях есть:
Когда мы присваиваем переменной типа Integer meaning типа
int
, при этом вызывается методInteger.valueOf
: функцияvalueOf
не всегда создает новый an object типа Integer. Она кэширует значения от -128 до 127.Если передаваемое meaning выходит за эти пределы, то новый an object создается, а если нет, то нет.
Если мы пишем
new Integer()
, то гарантированно создается новый an object. Если мы вызываемInteger.valueOf()
, явно or приautoboxing
, то этот метод может вернуть для нас How новый an object, так и отдать an object из кэша, если переданное число лежит в диапазоне от -128 до 127. -
Как работает кэширование при операции
autoboxing
?Ответил в вопросе выше, на всякий случай создал вопрос на StackOverFlow, но там отвечают тоже самое
-
Для Howих типов и/or значений работает кэширование?
В восьмом вопросе. Если у кого – то есть соображения на тему трех последних вопросов, то напишите в комментариях.
DefNeo
レベル 36
GO TO FULL VERSION