A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余银桂 中级黑马   /  2012-6-5 18:45  /  2584 人查看  /  11 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余银桂 于 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);   
                  }
//结果又是什么?

//一个比较坑爹的题目,今天刚好讲到才了解!!!

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

11 个回复

倒序浏览
张老师自动装箱与拆箱里面有讲到~~~
回复 使用道具 举报
本帖最后由 黄克帅 于 2012-6-6 00:55 编辑

Integer a = 127;
1.5 后新特性   自动装箱,等同于Integer a= new Integer(127);  
但是,当数值在byte范围内,如果值已经存在 ,新特性不会在开辟空间,否则开辟新空间,而==比较的是地址值
所以 test  结果true  , test1  结果false

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
伊文龙 发表于 2012-6-5 18:49
张老师自动装箱与拆箱里面有讲到~~~

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

嗯,看了源代码就知道了
回复 使用道具 举报
在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在缓存中没有了。

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
关于二楼的回答...我做了测试...发现可能会有错误....
二楼的回答是:
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

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
张老师讲的这是一种设计模式:享元模式
回复 使用道具 举报
余银桂 发表于 2012-6-5 19:09
嗯,看了源代码就知道了

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

回复 使用道具 举报
王广丛 发表于 2012-6-5 21:30
关于二楼的回答...我做了测试...发现可能会有错误....
二楼的回答是:
Integer a = 127;

这样说的确不妥
回复 使用道具 举报
这样定义是因为一个byte的范围是在-128~127之间 这个区间的数被用到的频率非常高 所有当Integer的对象的值在byte范围中的时候再被自动的存放到池中这样如果还有Integer 对象的值等于这个数的话 就会自动的去指向这个池的数 节省了内存资源(其实也节省不了多少 就是这样的设计的叫享元模式)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马