Integer j1 = -128; Integer j2 = -128;
System.out.println( j1==j2);
Integer a1 = 150; Integer a2 = 150;
System.out.println( a1==a2);Integer内的值的大小在Byte范围内时,==比较返回true 在那范围之外返回false 
这是为什么呢,为什么会这样》?

解决方案 »

  1.   

    Integer类中把-128到+127对应的Integer对象缓存了,对这个范围内的int数autoboxing的时候直接拿来用就可以了,从而避免了不断创建新对象的性能损失。
    算是享元设计模式的体现吧。
      

  2.   

    传说新版本的JAVA 会自动缓存BYTE范围内的值.
      

  3.   

    应该貌似好像也许是Integer的值范围跟BYTE一样吧
    俺也不懂
      

  4.   

    可以看valueOf方法的说明
    valueOf
    public static Integer valueOf(int i)返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer 实例,则通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过缓存经常请求的值而显著提高空间和时间性能。 参数:
    i - 一个 int 值。 
    返回:
    表示 i 的 Integer 实例。
    从以下版本开始: 
    1.5 通过缓存提高空间和时间性能,目标很明确。Integer i=5;这种后编译器自动的把它处理为Integer i=Integer.valueOf(5);剩下的问题直接去看valueOf()方法的代码就可以了。
      

  5.   

    1楼的说的不是很明白吗,“Integer类中把-128到+127对应的Integer对象缓存了”所以在Byte范围内是同一个对象
      

  6.   


    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);
        }确实是缓存了,Long,Integer,Short都有各自的缓存
    学习了..
      

  7.   

    正解
    在 autoboxing 中,Java 编译器会把
    Integer a1 = 150;
    Integer a2 = 150;
    处理成
    Integer a1 = Integer.valueOf(150);
    Integer a2 = Integer.valueOf(150);
      

  8.   

    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);
        }
    恩,懂了,谢谢ZangXT