黑马程序员技术交流社区

标题: 一个坑爹的题目!<已解决> [打印本页]

作者: 余银桂    时间: 2012-6-5 18:45
标题: 一个坑爹的题目!<已解决>
本帖最后由 余银桂 于 2012-6-6 22:28 编辑

        public void test(){

                Integer a = 127;

                Integer b = 127;

                System.out.println(a == b);   
            }
//结果是什么?
        public void test1(){

                       Integer a = 128;

                       Integer b = 128;

                       System.out.println(a == b);   
                  }
//结果又是什么?

//一个比较坑爹的题目,今天刚好讲到才了解!!!
作者: 伊文龙    时间: 2012-6-5 18:49
张老师自动装箱与拆箱里面有讲到~~~
作者: 黄克帅    时间: 2012-6-5 19:00
本帖最后由 黄克帅 于 2012-6-6 00:55 编辑

Integer a = 127;
1.5 后新特性   自动装箱,等同于Integer a= new Integer(127);  
但是,当数值在byte范围内,如果值已经存在 ,新特性不会在开辟空间,否则开辟新空间,而==比较的是地址值
所以 test  结果true  , test1  结果false
作者: 余银桂    时间: 2012-6-5 19:09
伊文龙 发表于 2012-6-5 18:49
张老师自动装箱与拆箱里面有讲到~~~

嗯,刚好是讲到这个,刚看代码的时候,怎么也想不通是为什么....
作者: 余银桂    时间: 2012-6-5 19:09
黄克帅 发表于 2012-6-5 19:00
Integer a = 127;
1.5 后新特性   自动装箱,等同于Integer a= new Integer(127);  
当数值在byte范围内, ...

嗯,看了源代码就知道了
作者: 刘伯阳    时间: 2012-6-5 19:16
在1.5里面
public void test(){

                Integer a = 127;

                Integer b = 127;

                System.out.println(a == b);   
            }
输出的是true
类似String一样   
对于这样直接赋值的Integer   当值的范围在   [-128,127]   时候   会不生成新的对象   直接把缓存中的对对象拿来用

但是如果:Integer   a=128;Integer   b=128
则返回false,因为128在缓存中没有了。
作者: 王广丛    时间: 2012-6-5 21:30
关于二楼的回答...我做了测试...发现可能会有错误....
二楼的回答是:
Integer a = 127;
1.5 后新特性   自动装箱,等同于Integer a= new Integer(127);  
当数值在byte范围内,如果字已经存在 ,新特性不会在开辟空间,否则开辟新空间,而==比较的是地址值
所以 test  结果true  , test1  结果false

但是我测试后发现,Integer a = new Integer(127)与Integer a = 127是不一样的,因为Integer a = 127是存储在堆栈中的,而new Integer(127)是存储在堆中的,所以是不一样的。
测试程序如下:


public class Test {
        public static void main(String args[]){
                Integer a = 127;
                Integer b = new Integer(127);       
                int e = 127;
                int f = 127;
                System.out.println(a == b);
                System.out.println(a == e);
                System.out.println(e == f);               
                Integer c = 128;
                Integer d = 129;
                System.out.println(c == d);
        }       
}
输出结果为:

false
true
true
false

作者: 付信榕    时间: 2012-6-5 22:14
张老师讲的这是一种设计模式:享元模式

作者: 袁錦泰    时间: 2012-6-5 23:21
余银桂 发表于 2012-6-5 19:09
嗯,看了源代码就知道了

如果问题被解决 请标记为已解决 谢谢
作者: 吴超    时间: 2012-6-6 00:25
其实你只需要知道,byte范围的数据都有自动装箱,在这里面范围都会有一个地址值被指向,所以127的地址是相同的
超过这个范围就需要重新创建对象,Integer a=new Integer(128);  
而128是new一个对象,要知道new这个关键字会在堆内存里开辟新空间,所以Integer a=new Integer(128);  的两个地址不同


作者: 黄克帅    时间: 2012-6-6 00:37
王广丛 发表于 2012-6-5 21:30
关于二楼的回答...我做了测试...发现可能会有错误....
二楼的回答是:
Integer a = 127;

这样说的确不妥
作者: 李啸    时间: 2012-6-6 01:56
这样定义是因为一个byte的范围是在-128~127之间 这个区间的数被用到的频率非常高 所有当Integer的对象的值在byte范围中的时候再被自动的存放到池中这样如果还有Integer 对象的值等于这个数的话 就会自动的去指向这个池的数 节省了内存资源(其实也节省不了多少 就是这样的设计的叫享元模式)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2