-
Was ist passiert
autoboxing
?Autoboxing ist ein Mechanismus zum impliziten Initialisieren von Objekten von Wrapper-Klassen (Byte, Short, Character, Integer, Long, Float, Double) mit den Werten ihrer entsprechenden ursprünglichen primitiven Typen (bzw. , , , , , ,
byte
,short
)char
,int
ohnelong
explizitefloat
Verwendungdouble
des Klassenkonstruktors.Autoboxing tritt auf, wenn ein Grundelement direkt einer Wrapper-Klasse zugewiesen wird (mit dem
=
Operator „ “) oder wenn ein Grundelement an die Parameter einer Methode (z. B. einer „Wrapper-Klasse“) übergeben wird. Sowohl Variablen primitiver Typen als auch Konstanten zur Kompilierungszeit (Literale undfinal
-Primitive) können automatisch in „Wrapper-Klassen“ gepackt werden. In diesem Fall müssen Literale syntaktisch korrekt sein, um eine Variable des ursprünglichen primitiven Typs zu initialisieren.Das Autoboxing von Variablen primitiver Typen erfordert eine genaue Übereinstimmung mit dem Typ des ursprünglichen Primitivs – dem Typ der „Wrapper-Klasse“. Wenn Sie beispielsweise versuchen, eine Typvariable automatisch
byte
in ein Boxformat umzuwandelnShort
, ohne zuvor eine explizite Umwandlung durchzuführen,byte->short
führt dies zu einem Kompilierungsfehler.Das Autoboxing von Konstanten primitiven Typs ermöglicht breitere Übereinstimmungsgrenzen. In diesem Fall ist der Compiler in der Lage, vorab eine implizite Erweiterung/Eingrenzung primitiver Typen durchzuführen. Die Transformation erfolgt in zwei Schritten:
-
implizite Erweiterung (Verengung) des ursprünglichen primitiven Typs auf den primitiven Typ, der der Wrapper-Klasse entspricht (für die Konvertierung
int->Byte
verengt der Compiler zunächst implizitint
aufbyte
) -
Automatisches Packen eines Grundelements in die entsprechende „Wrapper-Klasse“ (der Compiler führt automatische Packs durch
byte->Byte
). Allerdings gibt es in diesem Fall zwei zusätzliche Einschränkungen: -
Die Zuweisung eines Grundelements zu einem „Wrapper“ kann nur mit dem
=
Operator „ “ erfolgen (Sie können ein solches Grundelement nicht ohne explizite Typumwandlung an Methodenparameter übergeben). -
Der Typ des linken Operanden darf nicht älter sein als
Character
, der Typ des rechten Operanden darf nicht älter sein alsint
, (Erweiterung/Einschränkung ist erlaubtbyte <-> short
,byte <-> char
,short <-> char
und nur Eingrenzungbyte <- int
,short <- int
,char <- int
, alle anderen Optionen erfordern eine explizite Typumwandlung)
Ein zusätzliches Merkmal ganzzahliger „Wrapper-Klassen“, die durch Autoboxing-Konstanten im Bereich -128 +127 erstellt werden, besteht darin, dass sie von der JVM zwischengespeichert werden. Daher sind solche Wrapper mit denselben Werten Verweise auf ein Objekt.
-
-
Warum wird es verwendet
autoboxing
?Ich zitiere den Vortrag:
Wie Sie sich erinnern, gibt es in Java sowohl von der Klasse geerbte Typen
Object
als auch primitive Typen. Aber wie sich herausstellte, können so praktische Dinge wie Sammlungen und Generika nur mit Typen funktionieren, die von geerbt wurdenObject
. -
Альтернативы
autoboxing
?Не нашел ответа, но запостил на StackOverFlow.
Исходя из этой дискуссии, получается, что альтернатива
autoboxing
`у это использование примитивных типов, так Wie использовниеautoboxing
`a снижает производительность. Вывод: использоватьautoboxing
только там где это необходимо.Написана статья про
Autoboxing
: Autoboxing: Traps and Advantages -
Типы-обертки для примитивных типов
mutable
oderimmutable
?Immutable
, так Wie примитивные ein Objektы тожеimmutable
. Wasбы работать Wie сMutable
типом есть классMutableInteger
, и.т.д. -
Как примитивные типы приводятся к непримитивным аналогам?
На этот и последующий вопросы хорошо отвечает вот эта статья: Автоупаковка и распаковка в Java
Это заключение из нее: автоупаковка является механизмом для скрытого преобразования примитивных типов данных в соответствующие классы-оболочки (ein Objektы). Компилятор использует метод
valueOf()
чтобы преобразовать примитивные типы в ein Objektы, а методыIntValue()
,doubleValue()
и т.д., чтобы получить примитивные типы из ein Objektа (то есть обратное преобразование). Автоупаковка преобразует логический типboolean
вBoolean
,byte
вByte
,char
вCharacter
,float
вFloat
,int
вInteger
,long
вLong
,short
вShort
. Распаковка происходит в обратном направлении. -
Как непримитивные типы приводятся к примитивным?
Выше ответил.
-
Как сравниваются примитивные и непримитивные типы?
В лекции это подробно рассматривается, но я нашел так скажем тоже самое, но другими словами.
В Java есть два способа сравнивать ein Objektы на gleichtство,
==
и методequals()
.==
используется для примитивных типов. Для ein Objektов «==
» это исключительно сравнение ссылок. Для остальных случаев нужно использовать методequals()
. Кроме того методhashCode()
служит (в теории) для той же цели. Хорошим тоном считается, если вы переопределoderequals()
иhashCode()
. После инициализации неких ein Objektов a и b должно выполняться правило:Если выражение
a.equals(b)
вернет true, тоa.hashCode()
должен быть gleichtb.hashCode()
. -
Всегда ли создается новый ein Objekt при операции
autoboxing
?Это в лекциях есть:
Когда мы присваиваем переменной типа Integer Bedeutung типа
int
, при этом вызывается методInteger.valueOf
: функцияvalueOf
не всегда создает новый ein Objekt типа Integer. Она кэширует значения от -128 до 127.Если передаваемое Bedeutung выходит за эти пределы, то новый ein Objekt создается, а если нет, то нет.
Если мы пишем
new Integer()
, то гарантированно создается новый ein Objekt. Если мы вызываемInteger.valueOf()
, явно oder приautoboxing
, то этот метод может вернуть для нас Wie новый ein Objekt, так и отдать ein Objekt из кэша, если переданное число лежит в диапазоне от -128 до 127. -
Как работает кэширование при операции
autoboxing
?Ответил в вопросе выше, на всякий случай создал вопрос на StackOverFlow, но там отвечают тоже самое
-
Для Wieих типов и/oder значений работает кэширование?
В восьмом вопросе. Если у кого – то есть соображения на тему трех последних вопросов, то напишите в комментариях.
DefNeo
Level 36
GO TO FULL VERSION