Introduction à Autoboxing et Unboxing en Java

Autoboxing est la conversion automatique que le compilateur Java effectue entre les types primitifs et leurs classes d'encapsulage d'objet correspondantes, c'est-à-dire la conversion de int en entier, double en Double, etc. Unboxing est la conversion automatique des objets de classe d'encapsuleur en leurs primitives équivalentes, c'est-à-dire Integer en int etc. Cette fonctionnalité a été introduite dans la version 1.5 de java, la mise en boîte automatique et le déballage comme le sont les processus automatiques gérés par JRE, le point le plus important ici est d'écrire du code approprié, qui n'ajoute pas trop d'objets inutiles dans l'image.

Voyons maintenant comment le Autoboxing et le Unboxing en Java fonctionnent en interne -

  • Le compilateur utilise la méthode valueOf () pour convertir les primitives en objets wrappers correspondants (c.-à-d. L'autoboxing) en interne, dans le cas inverse, il utilise intValue (), doubleValue () etc. comme des paradigmes pour le déballage.
  • Pour référence, le wrapper et le mappage des primitives en java sont mentionnés ci-dessous -
Type primitifClasse Wrapper
booléenBooléen
octetOctet
carboniserPersonnage
flotteFlotte
intEntier
longueLongue
courtCourt
doubleDouble

Exemples -

  • Prenons une ArrayList of Integers maintenant et puis utilisons le concept de déballage -

import java.util.ArrayList;
public class MyClass (
public static void main(String args()) (
ArrayList intlist = new ArrayList();
//wrapper Integer objects being added here
intlist.add(1);
interest.add(2);
//auto-unboxing is happening here
int x = intlist.get(0);
System.out.println(x);
)
)

  • Par conséquent, dans l'exemple ci-dessus, tout en ajoutant de la valeur à x, nous voyons que x semble être une primitive, donc le déballage se produit ici automatiquement pendant que cette affectation est effectuée.

public class MyClass (
public static void main(String args()) (
Integer sum =0;
for(int i=0;i<10;i++)
(
sum = sum + i;
)
System.out.println(sum);
)
)

  • Juste au-dessus, nous avons montré un exemple -2 dans ce contexte, où un scénario typique a été présenté. Si vous êtes familiarisé avec la création d'objets en java, vous pouvez voir que "Integer sum = 0", déclare un objet, et lorsque nous effectuons le calcul à l'intérieur de la boucle for, nous pouvons voir que la valeur primitive "i" est ajoutée au wrapper " somme".
  • Par conséquent, on peut constater que d'abord, la conversion du wrapper en primitive se produira, car l'opérateur "+" ne fonctionne que sur les primitives, et donc le déballage d'objet se produira en premier, puis le calcul se produira, puis l'autoboxing d'objet se produira à nouveau, puis la valeur sera affecté à la variable «somme».
  • Cela présente une surcharge inutile sur la machine virtuelle Java car de nombreux objets entiers intermédiaires seront créés et détruits (pour être ultérieurement récupérés), ce qui peut ralentir, de sorte que ces logiques doivent être traitées avec soin.
  • Voyons maintenant des conditions différentes des perceptions générales et nous aurons un code où la boîte automatique et le déballage deviennent très importants à comprendre -

Considérez l'extrait de code placé ci-dessous, quelle sera, selon vous, la sortie de cela?

public class Main
(
public static void main(String() args) (
Integer m = 34123;
Integer x = 34123;
System.out.println(x==m);
)
)

  • Si vous dites «vrai», vous êtes «faux» car la sortie est également «fausse», c'est parce que nous pouvons comparer uniquement la plage entière de -128 à 127 comme ceci, pour les valeurs sortant de cette plage, elles doivent être déballé.
  • Par conséquent, nous devons comparer intValue () des entiers ci-dessus, pour l'instant, le compilateur fait cela en utilisant la propriété valueOf ().
  • Probablement, si cela tombe dans la plage citée ci-dessus, le code ci-dessus tel qu'il est donnera true car il se référera d'abord au pool littéral entier pour comparaison.

public class Main
(
public static void main(String() args) (
Integer m = 100;
Integer x = 100;
System.out.println(x==m);
)
)

Cela évaluera la valeur «vraie», car 100 est présent dans le pool littéral.

Autoboxing et Unboxing en Java avec surcharge de méthode

  • Avant d'étiqueter la mise en boîte automatique et le déballage de la surcharge de méthode, il est supposé que le lecteur est familiarisé avec le concept de surcharge de méthode, nous ne donnerons que peu d'informations et pour en savoir plus, veuillez vous référer à la documentation d'Oracle à ce sujet.
  • La surcharge de méthode est un processus où le même nom de méthode est utilisé avec un nombre différent d'arguments d'entrée, différents types de données de variables avec les mêmes noms, etc., utilisés pour présenter plusieurs variantes de toute méthode de calcul en général.
  • Prenons un exemple pour la même chose pour le comprendre plus profondément et nous présenterons également la sortie qui apparaît dans l'image cette fois -

public class Main
(
public static void main(String() args) (
Overload obj = new Overload();
int i =5;
obj.printval(5);
Integer m = i;
obj.printval(m);
)
)
class Overload
(
public void printval(int i)
(
System.out.println("printing the unboxed value "+ i);
)
public void printval(Integer i)
(
System.out.println("printing the autoboxed value "+ i);
)
)

Production -

impression de la valeur sans boîte 5
impression de la valeur de la zone automatique 5

Remarque - vous pouvez exécuter le programme ci-dessus dans n'importe quel IDE pour obtenir la sortie ci-dessus.

  • Par conséquent, le comportement ci-dessus indique clairement que la technique d'autoboxing a une utilisation importante dans les concepts de surcharge et doit être utilisée avec précaution lors du codage.

Avantages de l'Autoboxing et du Unboxing en Java-

  • La conversion appropriée est effectuée automatiquement par le compilateur.
  • Le développeur est censé écrire moins de code et donc du code plus propre.
  • Pas besoin d'expressions manuelles de transtypage.

Conclusion

Nous avons vu le cas d'utilisation de l'autoboxing et du unboxing, à quel point ce concept est implicite et où il peut créer des avantages et des inconvénients. Il doit être utilisé avec précaution lors du codage, sinon il peut ajouter une surcharge de conversion de calcul inutile, par conséquent, les conversions doivent être effectuées dans les primitives pour éviter une surcharge de collecte de déchets excessive et une création excessive d'objets temporaires. Nous avons également vu le cas d'utilisation de l'autoboxing avec le concept de surcharge de java, vous pouvez vérifier quelques contraintes supplémentaires avec cela.

Articles recommandés

Cela a été un guide pour Autoboxing et Unboxing en Java. Ici, nous discutons également Qu'est-ce que Autoboxing et Unboxing en Java? comment cela fonctionne-t-il en interne avec certains exemples de codes? Vous pouvez également consulter nos autres articles suggérés pour en savoir plus -

  1. Qu'est-ce que JDBC?
  2. Qu'est-ce que les génériques en Java?
  3. Groovy vs Java
  4. Qu'est-ce que l'héritage Java?
  5. Exemples et fonctionnement des génériques en C #
  6. JRE vs JVM | 8 principales différences avec (infographie)