Heim >Java >javaLernprogramm >Eine kurze Diskussion darüber, was Javas automatisches Boxen und automatisches Unboxing ist.

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

青灯夜游
青灯夜游nach vorne
2018-10-19 17:43:022730Durchsuche

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

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

true
false
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);
    }
}
Das laufende Ergebnis ist:

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

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen