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

求助 一个java基础问题
Java code


public class Test{
    public static void main(String[] args){
        Integer a = 100 ;
        Integer b = 100 ;
        
        Integer a2 = 200;
        Integer b2 = 200;
        
        
        System.out.println (a==b);
        
        System.out.println (a2==b2);
    }
}




输出的结果是true ,false 不知道为什么

------解决方案--------------------
Integer的范围在 [-128,127]
直接赋值的Integer当值的范围的时候,
不会生成新的对象,直接把缓存中的对象拿来用

可以看看Integer的源代码 里面有实现
------解决方案--------------------
你调试进去就知道了,Integer会自动缓存[-128,127]之间的Integer对象,
而Integer a=100调用的是函数Integer.valueOf(int),该函数对于这个
范围内的整数缓存起来并返回同一个实例,而之外的则每次创建一个新对象
------解决方案--------------------
我用程序运行了一遍,结果和楼主所说的一样。
在调试的过程中发现,装包中的Integer的自动缓存在[-128,127]之间,与前面三楼和六楼说的一样,如果超出这个范围,则比较的值结果为FALSE;否则为TRUE。
------解决方案--------------------
Java code

        Integer a = 100 ;
        Integer b = 100 ;
        Integer a2 = 200 ;
        Integer b2 = 200 ;
        Integer a3 = new Integer(100) ;
        Integer b3 = new Integer(100) ;
        System.out.println (a==b);
        System.out.println (a2==b2);
        System.out.println(a3==b3);

------解决方案--------------------
我是来学习地!!!
------解决方案--------------------
关键是两段代码,一个是valueOf方法实现boxing(可以从字节码中看出来调用了这个方法)
Java code

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);
    }

------解决方案--------------------
学习了

------解决方案--------------------
探讨
这是 java 5的新特性,基本数据类型的自动装箱和拆箱的问题,
如果是 Integer a2 = new Integer(200);Integer b2 = new Integer(200);
这样打出来就是false

------解决方案--------------------
头一次见,学习了!
------解决方案--------------------
这里果然是学习的好地方!我都看了一遍,虽然不懂,但觉得9楼的说法应该是正确的.
------解决方案--------------------
byte 类型的数据会被系统缓冲,也就是共享。

所以 128以内的都会这样。 你可以测试看看

127 = true
128 = false;

没啥特殊的


------解决方案--------------------
Integer会自动缓存[-128,127]之间的Integer对象
------解决方案--------------------
楼上说的虽然也有道理,但是和题目不相关啊~
学习了·~
------解决方案--------------------
以前还真没注意过这个,学习了……
------解决方案--------------------
首先
Java code
public class Test {
    public static void main(String[] args) {
        Integer a = 100;  //自动包装(或叫自动装箱)
        Integer b = 100;  //编译器会将其处理成 Integer b = Integer.valueOf(100);
        Integer a2 = 200;
        Integer b2 = 200;
        System.out.println (a == b);
        System.out.println (a2 == b2);
    }
}

------解决方案--------------------
哦,看到楼上的,明白了,学习了
------解决方案--------------------