Irgendwie habe ich beschlossen, auch die JDK-Quelle zu lesen. Trotzdem habe ich keine Zeit, jede Zeile sorgfältig zu lesen, also habe ich sie kurz gelesen und diesen Code gefunden.
Die Byte-Klasse ist eine Wrapper-Klasse für das primitive Byte. Es scheint, dass ich beim Lesen der Quelle nichts gefunden habe, was überraschend ist.
Erstens Felder und Konstruktoren. Nun, es ist eine Quelle, die sich jeder vorstellen kann.
Byte.java
private final byte value;
public Byte(byte value) {
this.value = value;
}
Tatsächlich gibt es eine ByteCache-Klasse, die in Javadoc nicht angezeigt wird.
Byte.java
private static class ByteCache {
private ByteCache(){}
static final Byte cache[] = new Byte[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Byte((byte)(i - 128));
}
}
Was wir tun, ist das Zwischenspeichern von Instanzen von -128 bis 127. Oh, das bedeutet, dass sich alle Bytewerte im Cache befinden.
Es ist ein Cache von ByteCache, auf den jedoch von valueOf verwiesen wird.
Byte.java
public static Byte valueOf(byte b) {
final int offset = 128;
return ByteCache.cache[(int)b + offset];
}
Befindet sich die Instanz im Cache, können Sie sie mit dem Operator == vergleichen. Ausprobieren.
Main.java
public static void main(String[] args) {
byte b0 = 1;
Byte b1 = new Byte(b0);
Byte b2 = Byte.valueOf(b0);
Byte b3 = b0;
System.out.println(b1 == b2);
System.out.println(b1 == b3);
System.out.println(b2 == b3);
}
Ergebnis ist ···
false
false
true
Das ist sehr schade. Es ist ganz natürlich, dass new Byte () eine andere Instanz erstellt, aber der Referenzwert der Instanz ist unterschiedlich. Die Tatsache, dass Autoboxing (Variable b3) mit Byte.valueOf () identisch ist, bedeutet jedoch, dass Autoboxing Byte.valueOf () anstelle von new Byte () aufruft.
Nicht wirklich. Apropos Kraft: Wenn Sie neues Byte (1) oder Byte.valueOf (1) schreiben, wird der Compiler wütend, dass der int-Typ nicht in den Byte-Typ konvertiert werden kann, aber Sie können sehen, dass die Konstante den Byte-Bereich nicht überschreitet! Ich fühle mich wie. Der Compiler scheint klug und ziemlich hartnäckig zu sein, daher möchte ich, dass er etwas flexibler ist.
Recommended Posts