类Integer具有缓存,缓存Integer值.因此,如果我使用方法valueOf或inBoxing,新值将不会被实例化,而是从缓存中获取.
我知道默认缓存大小为127,但由于VM设置可以扩展.我的问题是:在这些设置中缓存大小的默认值有多大,我可以操纵这个值吗?这个值取决于我使用的是哪个VM(32位还是64位)?
我现在正在调整遗留代码,可能需要从int转换为Integer.
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或只是查看源代码:
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的硬编码缓存.来自:
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); }