为什么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