Heim > Java > javaLernprogramm > Hauptteil

Eine kurze Diskussion darüber, was Javas automatisches Boxen und automatisches Unboxing ist.

青灯夜游
Freigeben: 2018-10-19 17:44:15
nach vorne
2693 Leute haben es durchsucht

Der Inhalt dieses Artikels besteht darin, kurz darüber zu sprechen, was Javas automatisches Boxen und automatisches Unboxing ist. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird Ihnen hilfreich sein.

Auto-Unboxing und Auto-Boxing

Java stellt für jeden Basisdatentyp entsprechende Wrapper-Typen bereit. Beispiel:

public class TestMain
{
    public static void main(String[] args)
    {
        Integer i = 10;
    }
}
Nach dem Login kopieren

In diesem Prozess wird das entsprechende Integer-Objekt automatisch basierend auf dem Wert erstellt. Dies ist automatisches Boxen . Schauen Sie sich einen anderen Code an:

public class TestMain
{
    public static void main(String[] args)
    {
        Integer integer = 10;
        int i = integer;
    }
}
Nach dem Login kopieren
In diesem Prozess werden die Daten

automatisch in Basistypen entsprechend dem Wrapper-Typ konvertiert, was dem automatischen Unboxing entspricht.

Das Prinzip des automatischen Ein- und Auspackens ist ebenfalls sehr einfach. Geben Sie über das Befehlszeilenprogramm CLASSPATH ein (d. h. den Pfad, in dem sich die .class-Datei im bin-Verzeichnis befindet), dekompilieren Sie mit Javap und überprüfen Sie den generierten Bytecode:

Es gibt viele dekompilierte Inhalte. Wir konzentrieren uns nur auf die wichtigsten Punkte. Teil:

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
Nach dem Login kopieren
sieht, dass, wenn

automatisch eingerahmt wird , die Java Virtual Machine automatisch die valueOf-Methode aufruft von Integer; während des automatischen Unboxings Wenn , die Java Virtual Machine automatisch die intValue-Methode von Integer aufruft. Das ist das Prinzip von Auto-Unboxing und Auto-Boxing.

Vorsicht vor Nullzeiger-Ausnahme

Es gibt so einen 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;
}
Nach dem Login kopieren
Dieses Verwendungsszenario kommt sehr häufig vor ein int-Wert in der Sitzung oder Anforderung, wenn es herausgenommen wird, wird es eine Szene ähnlich der oben geben. Seien Sie daher beim automatischen Unboxing vorsichtig mit Nullzeiger-Ausnahmen.

Kleine Falle

Sehen Sie sich zwei Codeteile an:

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);
    }
}
Nach dem Login kopieren
Das laufende Ergebnis ist:

true
false
Nach dem Login kopieren
Der zweite Teil des Codes ist:

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);
    }
}
Nach dem Login kopieren
Das laufende Ergebnis ist:

false
false
Nach dem Login kopieren
Der Grund für ein solches Ergebnis ist: valueOf() der Boxklassen Byte, Short, Integer , Long und Char Die Methode wird basierend auf der 128-Bit-Trennlinie zwischengespeichert. Wenn der Wert unter 128 und über -128 liegt, wird der Quellcode von valueOf(int.) im Cache verwendet i) ist:

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);
    }
Nach dem Login kopieren
Aber Float und Double werden es nicht tun. Der Grund ist auch sehr einfach, weil die Anzahl der Ganzzahlen in einem bestimmten Bereich von Byte, Short, Integer, Long und Char begrenzt ist, aber die zwei Gleitkommazahlen von float und double sind nicht vorhanden.

Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, dass er für das Studium aller hilfreich sein wird. Weitere verwandte Tutorials finden Sie unter

Java-Video-Tutorial, Java-Entwicklungsgrafik-Tutorial, Bootstrap-Video-Tutorial!

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion darüber, was Javas automatisches Boxen und automatisches Unboxing ist.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!