Schauen wir uns einen Code an:
public class main {public static void main (String [] args) {Integer num1 = 100; Ganzzahl Num2 = 100; Ganzzahl Num3 = 200; Ganzzahl num4 = 200; '' '// Ausgabeergebnis' 'system.out.println (num1 == num2); System.out.println (num3 == num4); }} Ratet mal, was das Ergebnis ist?
Viele Leute denken, dass das Ergebnis wahr ist, aber das Ergebnis ist nicht so.
WAHR
FALSCH
Warum ist dieses Ergebnis? Wenn das Ergebnis durch den Speicher erklärt wird, verweisen Num1 und Num2 auf dasselbe Objekt, während Num3 und Num4 auf verschiedene Objekte verweisen. Schauen wir uns anschließend an, warum, wie Sie den Quellcode der ValueOF -Methode des Typ -Integers ansehen:
public static Integer ValueOf (int i) {Assert IntegerCache.High> = 127; if (i> = integercache.low && i <= integercache.High) return Integercache.cache [i + 128]; Neue Ganzzahl zurückgeben (i); }Die Implementierung von IntegerCache:
'' '// IntegerCache, eine interne Klasse, beachten Sie, dass ihre Eigenschaften als statische endgültige "private statische Klasse Integercache {statische endgültige int hoch; '' '// Cache Obergrenze, vorübergehend null' 'statischer endgültiger Ganzzahl Cache []; '' '// Cache Integer Array' '' '// Block, warum ist es als Block definiert. '' '// Cache Untergrenze, unveränderlich. Nur die Obergrenze kann sich ändern '' '' '' // Hoher Wert können durch Eigenschaft konfiguriert werden. Beachten Sie, dass die untere Grenze des Intervalls festgelegt ist, int H = 127; if (IntegerCacheHighPropValue! Long.decode (IntegerCacheHighPropValue) .IntValue (); '' '// Nimm das größere als Obergrenze, aber es kann nicht größer sein als die Grenze der Ganzzahl max_value' 'i = math.max (i, 127); '' '// Maximale Arraygröße ist integer.max_value' '' H = Math.min (i, integer.max_value - -low); } High = H; '' '// Die Obergrenze wird bestimmt' '' '' // Sie können einen Cache -Block erstellen, auf die Cache -Array -Größe achten. // int j = niedrig; für (int k = 0; k <cache.length; k ++) cache [k] = new Integer (j ++); '' '// -128 zu hohen Werten werden dem Cache -Array eins nach einem' ''} private IntegerCache () {}} zugewiesenDurch diese beiden Code-Teile ist ersichtlich, dass beim Erstellen eines Ganzzahl-Typs über die ValueOF-Methode der Wertebereich [-128, 127] beträgt. In diesem Intervall zeigt der Zeiger auf eine Objektreferenz bereits in Integercache.cache. Wenn der Wert diesen Bereich überschreitet, wird ein neues Objekt erstellt.
Eine Sache zu beachten ist, dass nicht alle Typen in diesem Bereich enthalten sind. Sehen Sie sich den Doppeltyp an:
public class main {public static void main (String [] args) {double i1 = 100.0; Doppel I2 = 100,0; Doppel i3 = 200,0; Doppel i4 = 200,0; System.out.println (i1 == i2); System.out.println (i3 == i4); }}Endgültiger Ausgangsergebnis:
FALSCH
FALSCH
Aus dem spezifischen Grund, warum dies das Ergebnis ist, können Sie die Implementierung der Doppelwert -Methode im Quellcode überprüfen. Es unterscheidet sich von der Integer ValueOF -Methode, da die Anzahl der Ganzzahlwerte in einem bestimmten Bereich begrenzt ist, die schwimmenden Punktzahlen jedoch nicht sind.
Beachten Sie, dass die Implementierung von Wertschöpfungsmethoden von Ganzzahl, Short, Byte, Charakter und lang ähnlich ist.
Die Implementierung der ValueOF -Methode von Doppel und Float ist ähnlich.
Ziehen Sie einen ab und die Ergebnisse des Booleschen Typs haben zwei wahre oder falsche. Schauen Sie sich den Quellcode direkt an:
public static boolean valueof (boolean b) {return (b? true: false); }Die wahren und falschen werden wie folgt definiert:
public static final boolean true = new boolean (true); '' '' '' **/'' '' '' '' '*Public Static Final Boolean False = New Boolean (Falsch);
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.