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. Das letzte Mal war ich habe die Quelle von Byte gelesen, also ist als nächstes Short.
Die Short-Klasse ist eine Wrapper-Klasse für den primitiven Typ short. Erstens Felder und Konstruktoren. Nun, es ist eine Quelle, die sich jeder vorstellen kann.
Short.java
private final short value;
public Short(short value) {
this.value = value;
}
Tatsächlich gibt es eine ShortCache-Klasse, die in Javadoc nicht angezeigt wird.
Short.java
private static class ShortCache {
private ShortCache(){}
static final Short cache[] = new Short[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Short((short)(i - 128));
}
}
Ist es nicht eine Kopie der bisherigen Erklärung der Byte-Klasse? !! !! Derzeit besteht der Unterschied zur Byte-Klasse darin, dass Instanzen von -128 bis 127 zwischengespeichert werden. Es scheint, dass ich keine Instanz von -32768 bis 32767 erstellt habe, weil sie kurz ist.
Es ist ein Cache von ShortCache, auf den jedoch von valueOf verwiesen wird.
Short.java
public static Short valueOf(short s) {
final int offset = 128;
int sAsInt = s;
if (sAsInt >= -128 && sAsInt <= 127) { // must cache
return ShortCache.cache[sAsInt + offset];
}
return new Short(s);
}
Derzeit ist es dasselbe wie Byte, und wenn Sie new Short () ausführen, handelt es sich um eine weitere Instanz. Short.valueOf () und Autoboxing sind wahrscheinlich gleich.
Main.java
public static void main(String[] args) {
short s00 = 127;
Short s01 = Short.valueOf(s00);
Short s02 = s00;
System.out.println(s01 == s02);
short s10 = 128;
Short s11 = Short.valueOf(s10);
Short s12 = s10;
System.out.println(s11 == s12);
}
Ergebnis ist ···
true
false
Nun, es ist natürlich. In valueOf () verwendet 127 oder weniger den Cache, 128 oder mehr ist jedoch neu Short (). Derzeit liegt dieselbe Instanz im Bereich von -127 bis 128, es ist jedoch besser, Referenzwerte nicht zu stark zu vergleichen.
Es scheint jedoch Fälle zu geben, in denen der Vergleichsoperator == verwendet wird.
Main.java
public static void main(String[] args) {
short s11 = 128;
short s12 = 128;
Short s21 = s11;
Short s22 = s12;
System.out.println(s11 == s12);
System.out.println(s11 == s22);
System.out.println(s21 == s12);
System.out.println(s21 == s22);
}
Das erste ist ein Primitiv, das zweite ist ein Primitiv und ein Wrapper, und das vierte ist ein Wrapper-Vergleich. Tatsächlich sind das zweite und dritte beiläufig Auto-Unboxing. Daher ist das Ergebnis ...
true
true
true
false
Das ist ziemlich hart. Das Ergebnis ändert sich je nachdem, ob das s im Modellnamen unten oder oben ist, was für mich persönlich eine verrückte Stufe ist. Darüber hinaus gelten, wie ich bereits geschrieben habe, -127 bis 128 für alle 4. Wrapper. Wie kann ich dies jemandem erklären, der zum ersten Mal seit einem Monat wie Java ist und es zu 100% richtig versteht?
Es gibt eine Version namens JDK 1.4, und vorerst kann sogar das aktuelle JDK 1.8 auf dieser 1.4-Ebene kompiliert werden.
$ javac -source 1.4 -target 1.4 Main.java
Warnung: [options]Bootstrap-Klassenpfad-source 1.Nicht mit 4 eingestellt
Warnung: [options]Quellwert 1.4 ist veraltet und wird in einer zukünftigen Version entfernt
Warnung: [options]Zielwert 1.4 ist veraltet und wird in einer zukünftigen Version entfernt
Warnung: [options] 廃止されたオプションについてのWarnungを表示しないようにするには、-Xlint:Verwenden Sie die Option.
Main.java:15:Error:Inkompatibler Typ:Short kann nicht in Short konvertiert werden:
Short s21 = s11;
^
Main.java:16:Error:Inkompatibler Typ:Short kann nicht in Short konvertiert werden:
Short s22 = s12;
^
Main.java:18:Error:Binäroperator'=='Der Operandentyp von ist ungültig
System.out.println(s11 == s22);
^
Erster Typ: short
Zweiter Typ: Short
Main.java:19:Error:Binäroperator'=='Der Operandentyp von ist ungültig
System.out.println(s21 == s12);
^
Erster Typ: Short
Zweiter Typ: short
4 Fehler
4 Warnungen
Eigentlich ist auch JDK 1.4 selbst enthalten,
$ javac Main.java
Main.java:15:Inkompatibler Typ
Erkannter Wert: short
Erwarteter Wert: java.lang.Short
Short s21 = s11;
^
Main.java:16:Inkompatibler Typ
Erkannter Wert: short
Erwarteter Wert: java.lang.Short
Short s22 = s12;
^
Main.java:18:Operator==Ist kurz,java.lang.Gilt nicht für Short.
System.out.println(s11 == s22);
^
Main.java:19:Operator==Ist Java.lang.Short,Gilt nicht für Kurzschlüsse.
System.out.println(s21 == s12);
^
4 Fehler
Die Fehlermeldung ist etwas anders. Der Grund für den Fehler ist, dass seit JDK 1.5 Autoboxing / Unboxing hinzugefügt wurde. Was für eine Quelle haben Sie vor JDK 1.4 geschrieben?
Main.java
public static void main(String[] args) {
short s11 = 128;
short s12 = 128;
Short s21 = Short.valueOf(s11);
Short s22 = Short.valueOf(s12);
System.out.println(s11 == s12);
System.out.println(s11 == s22.shortValue());
System.out.println(s21.shortValue() == s12);
System.out.println(s21 == s22);
}
Es scheint tatsächlich so
Main.java
public static void main(String[] args) {
short s11 = 128;
short s12 = 128;
Short s21 = new Short(s11);
Short s22 = new Short(s12);
System.out.println(s11 == s12);
System.out.println(s11 == s22.shortValue());
System.out.println(s21.shortValue() == s12);
System.out.println(s21 == s22);
}
Was ist es? Short.valueOf (short) ist eine Methode, die aus JDK 1.5 hinzugefügt wurde. Wenn ich mit javac -source 1.4 -target 1.4 mit JDK 1.8 kompiliere, kann ich es kompilieren.
Ich denke, es wäre einfacher zu verstehen gewesen, wenn es kein automatisches Unboxing gegeben hätte.
Es gibt eine Methode namens compare, aber zum leichteren Verständnis ordnen wir sie als Byte, Short, Integer, Long an.
Byte.java
public static int compare(byte x, byte y) {
return x - y;
}
Short.java
public static int compare(short x, short y) {
return x - y;
}
Integer.java
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
Long.java
public static int compare(long x, long y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
Kannst du den Unterschied sehen? Obwohl ich ein Int in meiner eigenen Klasse war, habe ich es übersprungen und return x --y geschrieben; Es funktioniert irgendwie, aber im Extremfall läuft es bei x = 0x7FFFFFFF über; y = -1. Deshalb ist es ein Fehler.
Byte und Short geben also x - y zurück, da das Ergebnis in den Bereich von int fällt.
Dies ist das heutige Highlight. Ich meine, gab es so etwas? Wenn Sie so denken, wird es in JDK 1.8 hinzugefügt.
Short.java
public static int toUnsignedInt(short x) {
return ((int) x) & 0xffff;
}
public static long toUnsignedLong(short x) {
return ((long) x) & 0xffffL;
}
Was zu tun ist, ist von einem signierten Short in einen nicht signierten Short zu konvertieren. Da dies jedoch nicht durch Short ausgedrückt werden kann, wird es durch Int oder Long zurückgegeben. Da ich aus der C-Sprache zu Java gekommen bin, denke ich, dass ich es selbst schreiben sollte, aber ich denke, dass es besser ist, das vorbereitete zu verwenden, wie ein Makro in der C-Sprache. Ich werde.
Normalerweise benutze ich nicht Short, sondern Integer.
Recommended Posts