黑马程序员技术交流社区

标题: integer的==比较 [打印本页]

作者: 李阳    时间: 2013-3-6 17:31
标题: integer的==比较
本帖最后由 李阳 于 2013-3-7 11:05 编辑

考试第一题我就蒙了!
Integer a = 100;//自动装箱
int b = 100;//没有装箱
a是对象的引用,b是变量,为什么a==b就true呢?
作者: 莫嘉伟    时间: 2013-3-6 17:35
这个我觉得会不会是因为他们比较的时候把int那边的给自动装箱了,这样的话根据Integer类型的比较方式的话只要两个值一样就相等了。
作者: scott0610    时间: 2013-3-6 19:29
Integer 是int类型的包装类,int和Integer之间存在装箱和拆箱。这是由系统自动操作。所以a==b会返回true。
作者: 李洪因    时间: 2013-3-6 19:30
本帖最后由 李洪因 于 2013-3-6 19:56 编辑

int :基本数据类型,就如:double、char等。
Integer:是一种预定义JAVA包装类,用来对数字字符串进行处理,就如:String 是一种用来处理字符串的预定义类;
Integer可以理解成事int的包装类,它可以实例化对象。
联系:
Integer与int类型的比较
这里就无所谓是谁与谁比较了,Integer == int与int == Integer的效果是一样的,都会把Integer类型变量拆箱成int类型,然后进行比较,相等则返回true,否则返回false。同样,拆箱调用的还是intValue()方法。


int 和 Integer 都可以表示同一个整数,但是原理不一样,或者说:计算机给它们分配的内存空间不一样。比如:
int x = 20;
Integer x = new Integer(20)
它们都是往计算机中存储了一个值20,
但是第二个的原理更复杂。
两行代码:
Integer num;  // Line1
num = new Integer(78); // Line2
现在对以上代码进行分析,得出我们余下的几个概念。
Line1,申明一个整型变量 num ,还没有存到计算机中,因而 num 不是实际数据。
Line2,详细分析:
1、使用运算符 new 为变量 num 分配了一个内存空间来存整数。这个内存空间是有地址
的,假如,内存地址编号为:2500 ;
2、Integer(78) 表示把78这个值存储到这个编号为2500的内存中;
3、接下来 new 再返回给 num 的是这个已经存了值的内存空间的地址,即:2500;也就
是说,变量 num 存储的是已分配内存空间的地址2500,而 2500处的内存存储的是数字 78;
经过上面的分析,接下来我们就给出几个概念。
1、任何使用类申明的变量(如:num )称作 “引用变量”。严格的说,引用变量时存储
内存空间地址的变量。
2、存储数字78的内存空间2500 称作 “Integer 对象”,另外,我们将Integer对象称
作Integer类的 “实例”。
3、因为 num 是一个 Integer 类型的引用变量,因此, num 可以存储任意 Integer 对
象的地址;换句话说,num 可以指向或者引用任何 Integer 对象。我们将 num 指向
的 Integer 对象称作“num 对象”
4、“Integer 对象” 也即是 “num 对象”。
作者: 黑马_位志国    时间: 2013-3-6 19:34
Integer a = 100;   ------->100是int类型,当把100赋值给a时,int类型的100会自动装箱成Integer
int b = 100;

a==b ---->a和b进行比较时,Integer类型的a会自动拆箱成int类型,所以在进行比较时,返回true
作者: 沉默de羔羊    时间: 2013-3-6 19:49
兄弟,我告诉你,其实这个是jdk版本的问题:
在jdk1.5及其以上的版本中,基本类型和封装类能自动转化,所以a==b就true。
但是你在jdk1.5版本以下就没有这个自动转化的特征了,所以a==b就false。


作者: 张宁    时间: 2013-3-6 19:56
Integer a = 100;
int b = 100;
==     判断的是引用是不是指向同一个地址。很显然,在堆内存中, a 与 b 都指向100 这个内存块地址。a和b进行比较时,Integer类型的a会自动拆箱成int类型。
作者: 刘凯    时间: 2013-3-6 20:15
7楼正解
作者: 黑马-陈思源    时间: 2013-3-7 10:18
按照我的理解
Integer是个高级的int,他是一个类,其中包括创建一个int部分。如果你只是Integer a=100; 而没有new 实例化的话,这个表达式就完全和int a =100;相同了。
所以返回为 true。

希望对你有帮助




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