D'une manière ou d'une autre, j'ai décidé de lire également la source JDK. Cela dit, je n'ai pas le temps de lire attentivement chaque ligne, alors je l'ai lu brièvement et j'ai trouvé ce code.
La classe Byte est une classe wrapper pour l'octet de type primitif. Il semble que je n'ai rien trouvé en lisant la source, ce qui est surprenant.
Premièrement, les champs et les constructeurs. Eh bien, c'est une source que tout le monde peut imaginer.
Byte.java
private final byte value;
public Byte(byte value) {
this.value = value;
}
En fait, il existe une classe ByteCache qui ne peut pas être vue dans javadoc.
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));
}
}
Ce que nous faisons, c'est la mise en cache des instances de -128 à 127. Oh, cela signifie que toutes les valeurs d'octets sont dans le cache.
C'est un cache de ByteCache, mais il est référencé par valueOf.
Byte.java
public static Byte valueOf(byte b) {
final int offset = 128;
return ByteCache.cache[(int)b + offset];
}
Si l'instance est dans le cache, vous pouvez la comparer avec l'opérateur ==. Essaie.
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);
}
Le résultat est ···
false
false
true
C'est dommage. Il est tout à fait naturel que new Byte () crée une autre instance, mais la valeur de référence de l'instance sera différente. Cependant, le fait que l'autoboxing (variable b3) soit identique à Byte.valueOf () signifie que l'autoboxing appelle Byte.valueOf () au lieu de new Byte ().
Eh bien pas vraiment. En parlant de force, si vous écrivez de nouveaux Byte (1) ou Byte.valueOf (1), le compilateur se fâche que le type int ne puisse pas être converti en type byte, mais vous pouvez voir que la constante ne dépasse pas la plage d'octets! Je me sens comme. Le compilateur semble intelligent et assez têtu, je veux donc qu'il soit un peu plus flexible.
Recommended Posts