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

解决方案 »

  1.   

    这都被你发现了
    我觉得就算-128~127 地址相等,也不要用==来比较吧。大写的类都用equals方法比较相等,这样靠谱。
      

  2.   

    诸如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处于这之间,就返回缓存的对象。
      

  3.   

    ==是比较地址,equals是比较值。楼主的问题我不清楚,可能与堆和栈有关。
      

  4.   

    JVM会自动缓存-128~127范围内的值,所有在这个范围内的值相等的Integer对象都会共用一块内存,而不会开辟多个;超出这个范围内的值对应的Integer对象有多少个就开辟多少个内存
      

  5.   

    JVM会自动缓存-128~127范围内的值,所有在这个范围内的值相等的Integer对象都会共用一块内存,因而i1=i2;超出这个范围内的值对应的Integer对象就会自己开辟内存,不在同一个内存地址的两个值,不可能相等
      

  6.   

    让我去翻了一下资料,我讲一下吧,我觉得对楼主会有助的,呵呵:
    首先,java 会当装箱,也就是形如:int - >Integer的装箱,因为小点的整数java会认为我们经常要用,而大一点的整数我们不怎么常用,就因为如此,
    在一个字节之间,也就是 -128~127之间的整数,当装箱的时候,会缓存起来,当我们再次调用的时候,java就不会帮我们再创建新的,而是用我们原来的。
      

  7.   

    让我去翻了一下资料,我讲一下吧,我觉得对楼主会有助的,呵呵:
    首先,java 会当装箱,也就是形如:int - >Integer的装箱,因为小点的整数java会认为我们经常要用,而大一点的整数我们不怎么常用,就因为如此,
    在一个字节之间,也就是 -128~127之间的整数,当装箱的时候,会缓存起来,当我们再次调用的时候,java就不会帮我们再创建新的,而是用我们原来的。
      

  8.   

    http://www.ticmy.com/?p=110