黑马程序员技术交流社区

标题: 关于Integer的问题 [打印本页]

作者: 李敏    时间: 2012-4-11 13:51
标题: 关于Integer的问题
                        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
                        
能给我解释一下道里面的原理。。。。?
作者: 黑马张平    时间: 2012-4-11 14:08
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


作者: 李敏    时间: 2012-4-11 14:11
黑马张平 发表于 2012-4-11 14:08
Integer a = 123;   
Integer b = 123;
-128false

就是对你说的这个新特性不熟悉。
作者: 石好强    时间: 2012-4-11 14:21
基本数据类型对象,创建对象。
在JDK1.5版本以后,出现了一个新特性:考虑内存节省内存的原因,假如内存中已经存在一个对象,并取值在byte范围:-128~128
内。那么会优先使用已有对象,不会开辟新的对象。

而new这个动作,本身就是创建新对象。所以后面你创建的是两个不同的对象。

作者: 郑涛    时间: 2012-4-11 14:31
自动装箱的新特性有个原则就是如果自动装箱的数据在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
作者: 金兴    时间: 2012-4-11 14:33
在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返回的是同一个对象

作者: 山水游客    时间: 2012-4-11 16:24
Integer 是int的包装类,而本质是一个类,它的创建会在堆内存中开辟一块新的空间。而它的含义也是一个整型的数字,但是算术运算符不能操作它,在参数传递的时候,传递的是它所代表的对象的引用。而int类型在参数传递时,直接传值。
自动装箱规范要求boolean,byte,char<=127,介于-128~127之间的short和int包装到固定的对象中。 自动装箱时,对于值从-128-127之间的数,被装箱后,会被放在内存中进行重用,
Integer c = 128;
Integer d = 128;
超出了这个值的范围就不会被重用的,每次new出来的都是一个新的对象,结果自然会是false





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