Integer.valueOf

一. 深入代码
 
在创建数字 1 的对象时, 大多数人会使用 new Integer(1), 而使用 Integer.valueOf(1) 可以使用系统缓存,既减少可能的内存占用,也省去了频繁创建对象的开销。 

系统默认只缓存 -128~127 之间的整数。下面我们看一下 Integer.valueOf(int) 方法的代码: 

1 public static Integer valueOf(int i) {  
2     assert IntegerCache.high >= 127;  
3     if (i >= IntegerCache.low && i <= IntegerCache.high)  
4         return IntegerCache.cache[i + (-IntegerCache.low)];  
5     return new Integer(i);  
6 }  
注意到核心 IntegerCache.cache[i + (-IntegerCache.low)], 观察 IntegerCache 类的源码实现:
为 -128 ~ 127 数值提供自动装箱的缓存服务。  
 1 private static class IntegerCache {  
 2     static final int low = -128;  
 3     static final int high;  
 4     static final Integer cache[];  
 5   
 6     static {  
 7         // high value may be configured by property  
 8         int h = 127;  
 9         String integerCacheHighPropValue =  
10             sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");  
11         if (integerCacheHighPropValue != null) {  
12             int i = parseInt(integerCacheHighPropValue);  
13             i = Math.max(i, 127);  
14             // Maximum array size is Integer.MAX_VALUE  
15             h = Math.min(i, Integer.MAX_VALUE - (-low) -1);  
16         }  
17         high = h;  
18   
19         cache = new Integer[(high - low) + 1];  
20         int j = low;  
21         for(int k = 0; k < cache.length; k++)  
22             cache[k] = new Integer(j++);  
23     }  
24   
25     private IntegerCache() {}  
26 }  
static 静态代码块可知缓存的初始化是在第一次使用的时候。 通过 VM 参数-XX:AutoBoxCacheMax=<size> 可以配置缓存的最大值。 在 VM 初始化期间, 缓存最大值 high, 可能被保存在 sun.misc.VM class 的私有系统属性里。      
 
 
三. 总结
 
除非是 JDK 1.5 以前的环境, 如果系统不需要新对象, 则推荐使用 Long, Integer, Short, Character, Byte 的 valueOf() 方法提升性能。 
posted @ 2017-07-07 10:57  UniqueColor  阅读(524)  评论(0编辑  收藏  举报