Lassen Sie uns zuerst ein Testergebnis sehen:
/*public static void main (String [] args) {Integer a = 128, b = 128; Ganzzahl C = 127, d = 127; System.out.println (a == b); // false System.out.println (c == d); // true}*//*public static void main (String [] args) {Integer int1 = integer.valueof ("100"); Integer int2 = Integer.Valueof ("100"); System.out.println (int1 == int2); // true}*/public static void main (String [] args) {Integer int1 = integer.ValueOf ("300"); Integer int2 = Integer.Valueof ("300"); System.out.println (int1 == int2); // false}Der Quellcode von JDK lautet wie folgt:
public static Integer ValueOf (String S) löst NumberFormatexception aus {return Integer.ValueOf (ParseInt (s, 10)); } public static Integer valueOf (int i) {if (i> = integercache.low && i <= integercache.high) return integercache.cache [i + (-interegercache.low)]; Neue Ganzzahl zurückgeben (i); }Ich fand, dass es ein weiteres Rätsel im Inneren gab, und es gab eine Integercache -Klasse:
private statische Klasse IntegerCache {statische endgültige int low = -128; statische endgültige int hoch; statischer endgültiger Ganzzahl -Cache []; static {// hoher Wert kann durch Eigenschaft int H = 127 konfiguriert werden; String IntegerCacheHighPropValue = sun.misc.vm.getSavedProperty ("java.lang.Ineger.Inegercache.high"); if (IntegerCacheHighPropValue! i = math.max (i, 127); // Maximale Arraygröße ist integer.max_value h = math.min (i, ginneger.max_value -(-low) -1); } catch (numberFormatexception nfe) {// Wenn die Eigenschaft nicht in ein int analysiert werden kann, ignorieren Sie sie. }} High = H; Cache = New Integer [(hoch - niedrig) + 1]; int j = niedrig; für (int k = 0; k <cache.length; k ++) cache [k] = new Integer (j ++); // Bereich [-128, 127] muss internalisiert werden (JLS7 5.1.7) Integercache durchsetzen.High> = 127; } private IntegerCache () {}}Es stellt sich heraus, dass Ganzzahl alle Ganzzahlen von -128 bis 127 (einstellbar) instanziiert.
Dies erklärt die Antwort. Es stellt sich heraus, dass egal wie viele Ganzzahlen Sie in diesem Bereich erstellen, alle ValueOF verwenden, um dasselbe Objekt zu erzeugen.
Aber warum muss JDK auf diese Weise so viel tun? Denken wir sorgfältig darüber nach. Die meisten Produkte von Taobao sind unter 100 Yuan gepreist. Wie viele Ganzzahlen werden an einem Tag auf dem Backend -Server verwendet? Mit IntegerCache verringert es die Zeit, um neu zu werden und die Effizienz zu verbessern. Gleichzeitig bietet JDK auch Cache hochwert konfigurierbar.
Dies verbessert zweifellos die Flexibilität und erleichtert die Optimierung von JVM.
Zusammenfassen
Das obige ist der Inhalt dieses Artikels zum Lesen des Integer IntegerCache -Quellcodes. Ich hoffe, er wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!