其实这些东西比较简单,只是需要讲一下小整数的缓冲池(python的底层也是有的,这是相互抄袭的结果??),先看看代码
private static class IntegerCache { static final int high; static final Integer cache[]; //静态块中完成整数缓冲池的初始化 //为什么需要使用静态块?不使用静态块的话,high必须直接赋值,否则无法赋值 //使用了静态块,high可以动态的赋值,甚至根据JVM的启动参数设置high的值 static { final int low = -128; // high value may be configured by property int h = 127; //获得high的值 if (integerCacheHighPropValue != null) { // Use Long.decode here to avoid invoking methods that // require Integer's autoboxing cache to be initialized int i = Long.decode(integerCacheHighPropValue).intValue(); 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() {} }
其中的integerCacheHighPropValue由JVM的启动参数决定。-XX:AutoBoxCacheMax=<size>
/** * Cache to support the object identity semantics of autoboxing for values between * -128 and 127 (inclusive) as required by JLS. * * The cache is initialized on first usage. During VM initialization the * getAndRemoveCacheProperties method may be used to get and remove any system * properites that configure the cache size. At this time, the size of the * cache may be controlled by the vm option -XX:AutoBoxCacheMax=<size>. */ // value of java.lang.Integer.IntegerCache.high property (obtained during VM init) private static String integerCacheHighPropValue; //从虚拟机的启动参数中获得integerCacheHighPropValue static void getAndRemoveCacheProperties() { if (!sun.misc.VM.isBooted()) { Properties props = System.getProperties(); integerCacheHighPropValue = (String)props.remove("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) System.setProperties(props); // remove from system props } }