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 ?

青灯夜游
青灯夜游avant
2018-10-19 17:43:022731parcourir

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;
    }
}

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;
    }
}
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
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;
}
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);
    }
}
Le résultat en cours d'exécution est :

true
false
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);
    }
}
Le résultat en cours d'exécution est :

false
false
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);
    }
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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer