Wir alle wissen, dass Java einen Cache für Integer
(und einige andere Typen) für die Nummer im Bereich [-128, 127]
hat, die als "allgemein verwendet" gelten.Warum erlaubt die JVM den "hohen" Wert für den IntegerCache, aber nicht den "niedrigen" Wert?
Der Cache ist wie folgt konzipiert:
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() {}
}
Ich weiß, dass ich den high
Wert, indem Sie einen Parameter auf die JVM erweitern können:
java -Djava.lang.Integer.IntegerCache.high=xxxx Aclass.class
Was ich nicht verstehe ist, warum dürfen wir den low
Wert nicht überschreiben?
Beachten Sie, dass ich nicht versucht habe, eine Problemumgehung zu finden, sondern verstehe, warum dies aus irgendwelchen Gründen nicht erlaubt ist.