Maison > Java > javaDidacticiel > Une brève discussion sur ce qu'est la boxe automatique et le déballage automatique de Java ?

Une brève discussion sur ce qu'est la boxe automatique et le déballage automatique de Java ?

青灯夜游
Libérer: 2018-10-19 17:44:15
avant
2756 Les gens l'ont consulté

Le contenu de cet article est de parler brièvement de ce qu'est la boxe et le déballage automatiques de Java ? Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

Déballage automatique et boxing automatique

Java fournit des types de wrapper correspondants pour chaque type de données de base. Par exemple :

public class TestMain
{
    public static void main(String[] args)
    {
        Integer i = 10;
    }
}
Copier après la connexion

Dans ce processus, l'objet Integer correspondant sera automatiquement créé en fonction de la valeur Il s'agit d'une boxe automatique . Regardez un autre morceau de code :

public class TestMain
{
    public static void main(String[] args)
    {
        Integer integer = 10;
        int i = integer;
    }
}
Copier après la connexion
Dans ce processus, les données seront

automatiquement converties en types de base en fonction du type de wrapper, qui est le déballage automatique.

Quant au principe de l'encaissage automatique et du déballage automatique, il est également très simple. Via le programme de ligne de commande, entrez CLASSPATH (c'est-à-dire le chemin où se trouve le fichier .class dans le répertoire bin), décompilez avec javap et vérifiez le bytecode généré :

Il y a beaucoup de contenu décompilé, nous nous concentrons uniquement sur les points clés Partie :

public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=3, args_size=1
         0: iconst_1
         1: invokestatic  #16                 // Method java/lang/Integer.valueO
f:(I)Ljava/lang/Integer;
         4: astore_1
         5: aload_1
         6: invokevirtual #22                 // Method java/lang/Integer.intVal
ue:()I
         9: istore_2
        10: return
Copier après la connexion
Voyez que lorsque

est automatiquement mis en boîte, , La machine virtuelle Java appelle automatiquement le méthode valueOf de Integer ; en automatique Lors du déballage , la machine virtuelle Java appelle automatiquement la méthode intValue de Integer . C'est le principe du auto-unboxing et auto-boxing.

Attention aux exceptions de pointeur nul

Il existe un tel morceau de code :

public static void main(String[] args) throws Exception
{
    Object obj = getObj(null);
    int i = (Integer)obj;
}
    
public static Object getObj(Object obj)
{
    return obj;
}
Copier après la connexion
Ce scénario d'utilisation est très courant, nous mettons un int La valeur est placée dans la session ou la requête, et lorsqu'elle sera retirée, ce sera une scène similaire à celle ci-dessus. Par conséquent, faites attention aux exceptions de pointeur nul lors du déballage automatique.

Petit piège

Regardez les deux morceaux de code. Le premier morceau de code est :

public class TestMain
{
    public static void main(String[] args)
    {
        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;
        
        System.out.println(i1 == i2);
        System.out.println(i3 == i4);
    }
}
Copier après la connexion
Le résultat en cours d'exécution est :

true
false
Copier après la connexion
Le deuxième morceau de code est :

public class TestMain
{
    public static void main(String[] args)
    {
        Double d1 = 100.0;
        Double d2 = 100.0;
        Double d3 = 200.0;
        Double d4 = 200.0;
        
        System.out.println(d1 == d2);
        System.out.println(d3 == d4);
    }
}
Copier après la connexion
Le résultat en cours d'exécution est :

false
false
Copier après la connexion
La raison d'un tel résultat est : Octet, Short, Integer, Long, Char. La méthode valueOf() d'une classe de boxe est mise en cache en fonction de la ligne de séparation de 128 bits. Si la valeur est inférieure à 128 et supérieure à -128, la référence dans le cache sera prise comme un entier. Par exemple, sa valeurOf(int i) Le code source est :

public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache 
        return IntegerCache.cache[i + offset];
    }
        return new Integer(i);
    }
Copier après la connexion
Float et Double ne le feront pas. La raison est également très simple, car le nombre d'entiers dans une certaine plage d'octets, court, entier. , long et char sont limités, mais les deux nombres à virgule flottante float et double ne le sont pas.

Résumé : Ce qui précède représente l’intégralité du contenu de cet article, j’espère qu’il sera utile à l’étude de chacun. Pour plus de didacticiels connexes, veuillez visiter le

Tutoriel vidéo Java, le Tutoriel graphique de développement Java, le Tutoriel vidéo bootstrap !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers numéros
Impossible d'installer Java
Depuis 1970-01-01 08:00:00
0
0
0
Java peut-il être utilisé comme backend du Web ?
Depuis 1970-01-01 08:00:00
0
0
0
Installer JAVA
Depuis 1970-01-01 08:00:00
0
0
0
Aide : Données chiffrées JAVA Décryptage PHP
Depuis 1970-01-01 08:00:00
0
0
0
Est-ce en langage Java ?
Depuis 1970-01-01 08:00:00
0
0
0
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal