其实楼上兄弟想多了,应该还谈不上享元模式,也就是一个类似缓存的东西也可以叫做预加载吧。 我刚开始看到 这个问题也很稀奇,于是刚才看了一下 Integer类的源代码,明白了。其实楼主的结果不是必然的。根据环境的设置不同可以得到不同的结果。
其实 就是一个缓存, 在Integer 类有一个叫 IntegerCache 的内部类,起负责缓存(预加载) 符合一定规则的 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() {}
- }
复制代码 特别注意 这一句 sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
最终缓存的 数值范围可能是 -128 ~127 (默认的最大值) -128~Integer.MAX_VALUE-128 和-128 ~ 环境变量 java.lang.Integer.IntegerCache.high 所保存的值。
起逻辑是
如果 环境变量java.lang.Integer.IntegerCache.high 保存的值小于 127 那么 缓存的 就是 -128到127 的值
如果 环境变量java.lang.Integer.IntegerCache.high 保存的值 大于127 小于Integer.MaAX_VALVE - 128 那么 缓存的就是 -128 ~ 环境变量 java.lang.Integer.IntegerCache.high 所保存的值 这个范围的值
如果 环境变量保存的值过大 那么就保存 -128 ~ Integer.MaAX_VALVE - 128 这个范围的值
也就是说 我们可以通过设置环境变量类 设置 缓存的范围,不过 不应把 缓存的值范围设置的过大,显而易见,IntegerCache 与真正的缓存是有差别的,
并不是将一已存在的 数值对象缓存 而是 在第一次加载的时候 就会创建缓存对象。所以不应该把这个值设的过大。
可以通过一下命令是 楼主的 输出结果改变
JAVA -Djava.lang.Integer.IntegerCache.high=300 Test5
我已经测试过了,你可以试一试。
|