日期:2014-05-20  浏览次数:20643 次

关于Integer包装类的疑问
为什么java中的Integer包装类会有这样的规定:凡是一个Integer对象的值是在-128~127的范围内,那么它们的值和地址都是保证唯一性,而不在这个范围内就只有值相等而地址不同??

public class Test {

  public static void main(String[] args) {

  Integer i1 = 100;

  Integer i2 = 100;

  if (i1 == i2) {

  System.out.println("i1==i2");

  } else {

  System.out.println("i1!=i2");

  }

  Integer i3 = 200;

  Integer i4 = 200;

  if (i3 == i4) {

  System.out.println("i3==i4");

  } else {

  System.out.println("i3!=i4");

  }

  }

}

结果: 

i1==i2 

i3!=i4 



------解决方案--------------------
诸如Integer i1 = 100,在编译后就等同于Integer i1 = Integer.valueOf(100),既然是调用一个方法来获得对象,那么就有必要对valueOf方法一探究竟了。我们看下源码:
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);
}
到此应该恍然大悟了,IntegerCache缓存了[-128,127]之间的Integer对象,如果valueOf的参数i处于这之间,就返回缓存的对象。
------解决方案--------------------
JVM会自动缓存-128~127范围内的值,所有在这个范围内的值相等的Integer对象都会共用一块内存,而不会开辟多个;超出这个范围内的值对应的Integer对象有多少个就开辟多少个内存
------解决方案--------------------
http://www.ticmy.com/?p=110