-
Ce qui s'est passé
autoboxing
?L'autoboxing est un mécanisme permettant d'initialiser implicitement les objets des classes wrapper (Byte, Short, Character, Integer, Long, Float, Double) avec les valeurs de leurs types primitifs d'origine correspondants (respectivement, , , , , , ,
byte
,short
)char
,int
sans utilisationlong
explicite du constructeur de classe.float
double
L'autoboxing se produit lorsqu'une primitive est directement affectée à une classe wrapper (à l'aide de l'
=
opérateur " "), ou lorsqu'une primitive est passée dans les paramètres d'une méthode (telle qu'une "classe wrapper"). Les variables de types primitifs et les constantes de compilation (littéraux etfinal
-primitives) peuvent être automatiquement regroupées dans des « classes wrapper ». Dans ce cas, les littéraux doivent être syntaxiquement corrects pour initialiser une variable du type primitif d'origine.Le boxing automatique des variables de types primitifs nécessite une correspondance exacte du type de la primitive d'origine - le type de la « classe wrapper ». Par exemple, tenter de placer automatiquement une variable de type
byte
dansShort
, sans effectuer au préalable un transtypage explicite,byte->short
provoquera une erreur de compilation.Le boxing automatique des constantes de type primitif permet des limites de correspondance plus larges. Dans ce cas, le compilateur est capable d’effectuer à l’avance une extension/rétrécissement implicite des types primitifs. La transformation se déroule en deux étapes :
-
Expansion (rétrécissement) implicite du type primitif d'origine vers le type primitif correspondant à la classe wrapper (pour la conversion
int->Byte
, le compilateur se restreint d'abord implicitementint
àbyte
) -
emballage automatique d'une primitive dans la « classe wrapper » appropriée (le compilateur autopacks
byte->Byte
). cependant, dans ce cas, il existe deux restrictions supplémentaires : -
l'affectation d'une primitive à un « wrapper » ne peut être effectuée qu'à l'aide de l'
=
opérateur « » (vous ne pouvez pas transmettre une telle primitive aux paramètres de méthode sans conversion de type explicite) -
le type de l'opérande de gauche ne doit pas être plus ancien que
Character
, le type de l'opérande de droite ne doit pas être plus ancien queint
, (l'extension/constriction est autoriséebyte <-> short
,byte <-> char
,short <-> char
et seul le rétrécissementbyte <- int
,short <- int
,char <- int
, toutes les autres options nécessitent un transtypage explicite)
Une fonctionnalité supplémentaire des "classes wrapper" entières créées par les constantes d'autoboxing dans la plage -128 +127 est qu'elles sont mises en cache par la JVM. Par conséquent, ces wrappers avec les mêmes valeurs seront des références à un objet.
-
-
Pourquoi est-il utilisé
autoboxing
?Je citerai la conférence :
Comme vous vous en souvenez, Java possède à la fois des types hérités de la classe
Object
et des types primitifs. Mais il s'est avéré qu'une chose aussi pratique que les collections et les génériques ne peut fonctionner qu'avec des types hérités deObject
. -
Alternatives
autoboxing
?Je n'ai pas trouvé de réponse, mais je l'ai publiée sur StackOverFlow .
Sur la base de cette discussion, il semble qu'une alternative
autoboxing
à `a consiste à utiliser des types primitifs, car l'utilisationautoboxing
de `a réduit les performances. Conclusion : à utiliserautoboxing
uniquement lorsque cela est nécessaire.Un article a été écrit sur
Autoboxing
: Autoboxing : pièges et avantages -
Types wrapper pour les types primitifs
mutable
ouimmutable
?Immutable
, puisque les objets primitifs aussiimmutable
. Pour travailler avecMutable
un type, il existe une classeMutableInteger
, etc. -
Comment les types primitifs sont-ils réduits à leurs homologues non primitifs ?
Cet article répond bien à cette question et aux suivantes : Emballage et déballage automatiques en Java
Voici la conclusion : l'autoboxing est un mécanisme de conversion cachée de types de données primitifs en classes wrapper (objets) correspondantes. Le compilateur utilise la méthode
valueOf()
pour convertir les types primitifs en objets, et les méthodesIntValue()
,doubleValue()
etc., pour obtenir les types primitifs de l'objet (c'est-à-dire la conversion inverse). L'autoboxing convertit le type booléenboolean
enBoolean
,byte
enByte
,char
enCharacter
,float
enFloat
,int
enInteger
,long
enLong
,short
enShort
. Le déballage s'effectue dans le sens inverse. -
Comment les types non primitifs sont-ils convertis en primitifs ?
Répondu ci-dessus.
-
Comment les types primitifs et non primitifs se comparent-ils ?
La conférence en parle en détail, mais j’ai trouvé, disons la même chose, mais dans des termes différents.
En Java, il existe deux façons de comparer des objets pour vérifier leur égalité,
==
et leequals()
.==
используется для примитивных типов. Для 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
Niveau 36
GO TO FULL VERSION