Sehen Sie sich zunächst die Ergebnisse unten an
1.System.out.println(127==127); //true , int type compare2.System.out.println(128==128); //true , int type compare3.System.out.println(new Integer(127) == new Integer(127)); //false, object compare4.System.out.println(Integer.parseInt("128")==Integer.parseInt("128")); //true, int type compare5.System.out.println(Integer.valueOf("127")==Integer.valueOf("127")); //true ,object compare, because IntegerCache return a same object6.System.out.println(Integer.valueOf("128")==Integer.valueOf("128")); //false ,object compare, because number beyond the IntegerCache7.System.out.println(Integer.parseInt("128")==Integer.valueOf("128")); //true , int type compare
Erklärung
Beim Vergleich von int-Ganzzahlkonstanten ist == ein Wertvergleich. 1,2 gibt also true zurück. 1, 2 sind Wertvergleiche.
new Integer() erstellt jedes Mal ein neues Integer-Objekt, sodass 3 false zurückgibt. 3 ist der Objektvergleich.
Integer.parseInt erstellt jedes Mal eine int-Konstante, sodass 4 true zurückgibt. 4 ist ein Wertevergleich.
Integer.valueOf gibt ein Integer-Objekt zurück. Standardmäßig gibt es ein im Cache vorhandenes Objekt zwischen -128 und 127 zurück, sodass 5 true und 6 false zurückgibt. 5 und 6 sind Objektvergleiche.
Der siebte ist etwas Besonderes, es ist ein Vergleich zwischen int und Integer. Das Ergebnis ist ein Wertvergleich und gibt true zurück.
Zusammenfassung
Bestimmen Sie beim Ganzzahlvergleich zunächst, ob es sich um einen Wertvergleich oder einen Objektvergleich handelt. Der Wertvergleich gibt definitiv „true“ zurück Wert, es ist ein Wertevergleich. Der Objektvergleich hängt davon ab, wie das Objekt erstellt wird. Wenn Sie die neue Integer-Methode verwenden, wird jedes Mal ein neues Objekt generiert. Wenn es sich um die Integer.valueOf-Methode handelt, achten Sie darauf, ob der Wert falsch ist Der Bereich liegt zwischen -128 und 127. Wenn dies der Fall ist, sind die konstruierten Objekte mit demselben Wert dasselbe Objekt. == gibt nach dem Vergleich „true“ zurück, andernfalls wird „false“ zurückgegeben.
Für den Wertvergleich == gibt es also kein Problem. Für den Ganzzahlvergleich ist es am besten, den Objektinhalt mit der Gleichheitsmethode zu vergleichen null.
Wissenserweiterung
Analysieren Sie den Integer.valueOf-Quellcode
1. Die von uns aufgerufene Integer.valueOf-Methode ruft zuerst parseInt auf, um ihn zu konvertieren in int-Typwert umwandeln und dann seine eigene überladene Methode anpassen
public static Integer valueOf(String s) throws NumberFormatException {return Integer.valueOf(parseInt(s, 10)); }
2.Integer.valueOf überladene Methode bestimmt basierend auf der Größe des Werts i, ob eine Ganzzahl abgerufen werden soll Objekt aus dem Cache
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i); }
3. Der Konstruktor von Integer ist sehr einfach
public Integer(int value) {this.value = value; }
4 interne Klasse von Integer, drei Attribute (ein zwischengespeichertes Integer-Array + eine Reihe von Cache-Bereichen)
private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by property(最大值可配置)int h = 127; String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); //读取VM参数if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue); //配置值转换成int数值i = Math.max(i, 127); //和127比较,取较大者// Maximum array size is Integer.MAX_VALUE(控制缓存数组的大小,最大为整型的最大值,这样一来,h值就必须小于整型最大值,因为要存 -128~0这129个数嘛)h = Math.min(i, Integer.MAX_VALUE - (-low) -1); //实际就是 h=Math.min(i,Integer.MAX_VALUE-129),正整数能缓存的个数} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; //构造缓存数组int j = low;for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); //将一些int常量缓存进Integer对象数组缓存中去// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127; //如果小于127,抛异常}private IntegerCache() {} }
Nachdem Sie den obigen Integer.valueOf-Quellcode gelesen haben, werden Sie feststellen, dass dies die Standardeinstellung ist Integer-Cache Der int-Konstantenpool ist konfigurierbar und fügt Folgendes hinzu: -Djava.lang.Integer.IntegerCache.high=200
Intellij IDEA die Laufkonfiguration.
Das obige ist der detaillierte Inhalt vonInteger.valueOf、 Integer.parseInt 、 neue Ganzzahl. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!