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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李敏 中级黑马   /  2012-4-11 13:51  /  1907 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

                        Integer a = 123;   
                        Integer b = 123;
                        Integer c = 128;
                        Integer d = 128;
                        Integer e = new Integer(123);
                        Integer f = new Integer(123);
                        ------>     a==b ---->true
                                c==d ---->false
                                e==f ---->false
                        
能给我解释一下道里面的原理。。。。?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

6 个回复

倒序浏览
Integer a = 123;   
Integer b = 123;
-128<a<127时 因为数值在byte范围内容,对于新特性,如果该数值已经存在,则不会在开辟新的空间。节省内存空间。
所以a==b ---->true
Integer c = 128;
Integer d = 128;
128  数值不在byte范围内容,在内存中是2个对象,
所以c==d ---->false
但Integer e = new Integer(123);
Integer f = new Integer(123);
虽然你传的是byte范围内容,但 new Integer(),是在栈内存中开辟一新空间,你new 2次,就是2个不同对象。
所以是e==f ---->false

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
黑马张平 发表于 2012-4-11 14:08
Integer a = 123;   
Integer b = 123;
-128false

就是对你说的这个新特性不熟悉。
回复 使用道具 举报
基本数据类型对象,创建对象。
在JDK1.5版本以后,出现了一个新特性:考虑内存节省内存的原因,假如内存中已经存在一个对象,并取值在byte范围:-128~128
内。那么会优先使用已有对象,不会开辟新的对象。

而new这个动作,本身就是创建新对象。所以后面你创建的是两个不同的对象。
回复 使用道具 举报
自动装箱的新特性有个原则就是如果自动装箱的数据在byte范围(-128~128)之内,同样的数据不开辟新的空间。
所以超出范围的Integer c = 128;
                        Integer d = 128;
结果会是c==d ---->false
而Integer e = new Integer(123);
   Integer f = new Integer(123);这是两个对象啊,具有不同的地址值,在没有说明覆写equals方法的时候,默认比较的是对象的地址值。
所以e==f----->false
回复 使用道具 举报
在jdk1.5提供了int与Integer的自动拆箱与装箱功能。能过实现他们的相互转换。譬如:
Integer i =8;
int j = i;
反之亦然。
Integer iobj = 4;             //自动装箱
System.out.println(iobj+10);  //自动拆箱
这都是jdk1.5之后提供的  之前版本不能用

new Integer返回的永远是不同的对象,但是当整数范围在-128<i<=127时,Integer.valueOf返回的是同一个对象
回复 使用道具 举报
Integer 是int的包装类,而本质是一个类,它的创建会在堆内存中开辟一块新的空间。而它的含义也是一个整型的数字,但是算术运算符不能操作它,在参数传递的时候,传递的是它所代表的对象的引用。而int类型在参数传递时,直接传值。
自动装箱规范要求boolean,byte,char<=127,介于-128~127之间的short和int包装到固定的对象中。 自动装箱时,对于值从-128-127之间的数,被装箱后,会被放在内存中进行重用,
Integer c = 128;
Integer d = 128;
超出了这个值的范围就不会被重用的,每次new出来的都是一个新的对象,结果自然会是false
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马