Explication détaillée de l'emballage Java et du déballage
Préface:
Pour comprendre les concepts d'emballage et de déballage, vous devez comprendre les types de données Java
Encadré: package des types de base avec leurs types de référence correspondants pour les faire avoir les propriétés des objets. Int emballé en entier, flottant emballé dans le flotteur
Débrandre: contrairement à la boxe, simplifie les objets de types de référence aux données de types de valeur
Entier a = 100;
Voir le code suivant
M1
classe publique DataType {public static main (String args []) {dataType dt = new dataType (); eger a = nouvel entier (128); System.out.println ("M12 Result" + (a == b));Quels sont les résultats de l'impression?
M11 Résultat faux M12 Résultat faux
"==" Compare l'adresse, alors que les adresses des objets A et B sont différentes, c'est-à-dire ce sont deux objets, donc ils sont tous les deux faux
Analyse bytecode via Javap, le contenu est le suivant
Public void M11 (); / lang / entier; 15: Store_2 16: GetStatic # 53; Java / Lang / System.out: ljava / io / printStream; 19: nouveau # 59; _2 30: if_acmpne 37 33: iconst_1 34: goto 38 37: iconst_0 38: invokeVirtual # 66; Java / Lang / StringBuilder.APPEL: (Z) Ljava / Lang / StringBuilder; V 47: Return public void m12 (); // Méthode Java / Lang / Integer. "<IniT>" :( I) : Nouveau # 59; InvokEspecial # 63; invokeVirtual # 74;
M2
Classe publique DataType {public static Main (String Args []) {DataType DT = nouveau DataType (); OID M22 () {entier a = nouveau entier (128); Entier (128);Le résultat d'impression est
M21 Résultat falsem22 Résultat faux
A et B sont encore deux objets
Contenu de l'analyse Javap
Public Void M21 (); Code: 0: Nouveau # 44; // Méthode java / lang / entier. "<Init>" :( i) v 19: store_2 20: getStatic # 53; Java / Lang / System.out: ljava / io / printStream; 23: nouveau # 59; aload_2 34: if_acmpne 41 37: iconst_1 38: goto 42 41: iconst_0 42: invokeVirtual # 66; Java / Lang / StringBuilder.APPEL: (Z) Ljava / Lang / StringBuilder; V 51: Retourne Void M22 (); Code: 0: Nouveau # 74; // Méthode Java / Lang / Integer. Ljava / IO / PrintStream; 25: Nouveau # 59; # 86; / Méthode Java / Lang / StringBuilder; Java / Lang / StringBuilder.ToString :() Ljava / Lang / String; 50: invokeVirtual # 74;
M3
classe publique DataType {public static Main (String Args []) {DataType dt = new dataType (); = 128; entier b = 128; }}Résultats d'impression
M31 Résultat Truem32 Résultat faux
Pourquoi y a-t-il un premier vrai et un deuxième faux? Observer les données analysées par Javap
Contenu de l'analyse Javap
Public Void M31 (); 2 12: GetStatic # 53; Java / Lang / StringBuilder 18: DUP 19: LDC # 88; # 70; /lang/integer.valueof:(i)ljava/lang/integer; 6: ASTORE_1 7: SIPUSH 128 10: invokestatic # 49; Java / Lang / Integer. 63; if_acmpne 35 31: iconst_1 32: goto 36 35: iconst_0 36: invokeVirtual # 66; 42: InvokeVirtual # 74;
M4
classe publique DataType {public static main (String args []) {dataType dt = new dataType (); 42 () {entier a = entier.valueof (128); System.out.println ("M42 Result" + (a == b));Résultats d'impression
M41 Résultat Truem42 Résultat faux
Contenu de l'analyse Javap
Public Void M41 (); 2 12: GetStatic # 53; Java / Lang / StringBuilder 18: DUP 19: LDC # 92; # 70; /lang/integer.valueof:(i)ljava/lang/integer; 6: ASTORE_1 7: SIPUSH 128 10: invokestatic # 49; Java / Lang / Integer. 63; if_acmpne 35 31: iconst_1 32: goto 36 35: iconst_0 36: invokeVirtual # 66; 42: invokeVirtual # 74;
analyser
Javap est un outil qui est livré avec Java.
Jetons un coup d'œil à M4 d'abord.
Mais l'objet a est généré en appelant Integer.Valueof (), et B est un objet généré par la boxe automatique. Jetons un coup d'œil au bytecode.
La méthode M41 ne s'applique qu'une valeur de valeur (), mais elle apparaît deux fois dans le bytecode, ce qui signifie que la valeur de () est également appelée pendant la boxe automatique.
Ce qui suit est la mise en œuvre spécifique de la valeur de ()
/ ** * Renvoie une instance <tt> entière </tt> représentant la valeur spécifiée * <tt> int </tt>. <code> int </code>. }
Dans les nombres entre [-128, 127], la valeur de renvoie un objet dans le cache, de sorte que les deux appels renvoient le même objet.
Merci d'avoir lu, j'espère que cela peut vous aider.