首先看一段代码(使用JDK 5),如下:
- public class Hello   
- {   
-   public static void main(String[] args)   
-   {   
-     int a = 1000, b = 1000;   
-     System.out.println(a == b);   
-   
-     Integer c = 1000, d = 1000;   
-     System.out.println(c == d);   
-   
-     Integer e = 100, f = 100;   
-     System.out.println(e == f);   
-   }   
- }   
 
输出结果:
The Java Language Specification, 3rd Edition 写道:
- 为了节省内存,对于下列包装对象的两个实例,当它们的基本值相同时,他们总是==:  
-  Boolean  
-  Byte  
-  Character, \u0000 - \u007f(7f是十进制的127)  
-  Integer, -128 — 127  
 
查看jdk源码,如下:
-   
-     
-     private static String 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);  
-         }  
-     }  
-   
-     private static class IntegerCache {  
-         static final int high;  
-         static final Integer cache[];  
-   
-         static {  
-             final int low = -128;  
-   
-             
-             int h = 127;  
-             if (integerCacheHighPropValue != null) {  
-                 
-                 
-                 int i = Long.decode(integerCacheHighPropValue).intValue();  
-                 i = Math.max(i, 127);  
-                 
-                 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) {  
-         if(i >= -128 && i <= IntegerCache.high)  
-             return IntegerCache.cache[i + 128];  
-         else  
-             return new Integer(i);  
-     }  
 
这儿的IntegerCache有一个静态的Integer数组,在类加载时就将-128 到 127 的Integer对象创建了,并保存在cache数组中,一旦程序调用valueOf 方法,如果i的值是在-128 到 127 之间就直接在cache缓存数组中去取Integer对象。
再看其它的包装器:
 
- Boolean:(全部缓存)
- Byte:(全部缓存)
- Character(<= 127缓存)
- Short(-128 — 127缓存)
- Long(-128 — 127缓存)
- Float(没有缓存)
- Doulbe(没有缓存)
 
 
同样对于垃圾回收器来说:
- Integer i = 100;     
- i = null;
 
这里的代码不会有对象符合垃圾回收器的条件,这儿的i虽然被赋予null,但它之前指向的是cache中的Integer对象,而cache没有被赋null,所以Integer(100)这个对象还是存在。
 
而如果i大于127或小于-128则它所指向的对象将符合垃圾回收的条件:
 
- Integer i = 10000;     
- i = null;
 java Integer类的缓存(转)
原文:http://www.cnblogs.com/lxmyhappy/p/7355983.html