- valueOf - konvertiert in die Wrapper-Klasse
- parseInt - konvertiert in primitiven Typ
Integer.parseInt akzeptiert nur String und gibt den primitiven Integer-Typ (int) zurück.
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
Iteger.valueOf akzeptiere int und String. Wenn value String ist, konvertieren Sie valueOf mit parseInt in das einfache int und geben Sie eine neue Ganzzahl zurück, wenn die Eingabe kleiner als -128 oder größer als 127 ist. Wenn die Eingabe im Bereich (-128 - 127) liegt, werden immer die Integer-Objekte von a zurückgegeben interner IntegerCache. Die Integer-Klasse verwaltet eine innere statische IntegerCache-Klasse, die als Cache fungiert und Integer-Objekte von -128 bis 127 enthält. Wenn wir beispielsweise versuchen, ein Integer-Objekt für 127 abzurufen, erhalten wir immer dasselbe Objekt.
Iteger.valueOf(200)wird neue Ganzzahl von 200 geben. Es ist wie new Integer(200)
Iteger.valueOf(127)das gleiche wie Integer = 127;
Wenn Sie String nicht in die Ganzzahl konvertieren möchten, verwenden Sie Iteger.valueOf.
Wenn Sie String nicht in das einfache int konvertieren möchten, verwenden Sie Integer.parseInt. Es funktioniert schneller.
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
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");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} 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++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
Ein Vergleich von Integer.valueOf (127) == Integer.valueOf (127) ergibt true
Integer a = 127; // Compiler converts this line to Integer a = Integer.valueOf(127);
Integer b = 127; // Compiler converts this line to Integer b = Integer.valueOf(127);
a == b; // return true
Weil es die Integer-Objekte mit den gleichen Referenzen aus dem Cache nimmt.
Integer.valueOf (128) == Integer.valueOf (128) ist jedoch falsch, da 128 außerhalb des IntegerCache-Bereichs liegt und neue Integer zurückgibt, sodass Objekte unterschiedliche Referenzen haben.