类Integer具有缓存,它缓存Integer值。因此,如果我使用method valueOf或inboxing,则不会实例化新值,而是从缓存中获取。
Integer
valueOf
我知道默认的缓存大小为,127但由于VM设置而可以扩展。我的问题是:这些设置中的缓存大小的默认值有多大,我可以操纵该值吗?这个值取决于我使用哪个VM(32位或64位)吗?
127
我现在正在调整遗留代码,可能需要从int到Integer的转换。
澄清:以下代码是我在Java源代码中找到的
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) { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low)); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {} } public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
因此,我认为缓存是可配置的。
内部Java实现,无法配置,范围是 -128到127 。您可以检查Javadocs或仅查看来源:
Javadocs
public static Integer valueOf(int i) { final int offset = 128; if (i >= -128 && i <= 127) { // must cache return IntegerCache.cache[i + offset]; } return new Integer(i); }
UPD。 我 错了 (感谢Marco Topolnik)。以上所有内容都与较旧的Java实现有关。对于 Java 7 实现,可以使用系统属性来实现:
-Djava.lang.Integer.IntegerCache.high=<size>
或JVM设置:
-XX:AutoBoxCacheMax=<size>
UPD。 2 java.math.BigInteger具有值 -16 <= x <= 16的硬编码缓存。从来源:
java.math.BigInteger
private final static int MAX_CONSTANT = 16; private static BigInteger posConst[] = new BigInteger[MAX_CONSTANT+1]; private static BigInteger negConst[] = new BigInteger[MAX_CONSTANT+1]; static { for (int i = 1; i <= MAX_CONSTANT; i++) { int[] magnitude = new int[1]; magnitude[0] = i; posConst[i] = new BigInteger(magnitude, 1); negConst[i] = new BigInteger(magnitude, -1); } } public static BigInteger valueOf(long val) { // If -MAX_CONSTANT < val < MAX_CONSTANT, return stashed constant if (val == 0) return ZERO; if (val > 0 && val <= MAX_CONSTANT) return posConst[(int) val]; else if (val < 0 && val >= -MAX_CONSTANT) return negConst[(int) -val]; return new BigInteger(val); }