黑马程序员技术交流社区

标题: 关于==的一个题目,多谢 [打印本页]

作者: iBadboy    时间: 2013-7-22 13:22
标题: 关于==的一个题目,多谢
本帖最后由 iBadboy 于 2013-7-23 07:17 编辑

代码片段1
Java代码
public static void main(final String[] args) {
Integer a = new Integer(100);
Integer b = 100;
System.out.println(a == b);

代码片段2
Java代码
public static void main(final String[] args) {
Integer a = 100;
Integer b = 100;
System.out.println(a == b);

代码片段3
Java代码
public static void main(final String[] args) {
Integer a = 156;
Integer b = 156;
System.out.println(a == b);
}

代码片段4
Java代码
public static void main(final String[] args) {
Integer a = Integer.valueOf(100);
Integer b = 100;
System.out.println(a == b);
}


结果为啥是下面这样的?2、3、4的对错为啥?

代码片段1 是false
代码片段2是true。
代码片段3 是false
代码片段4 为true



作者: liuzhming    时间: 2013-7-22 13:59
本帖最后由 liuzhming 于 2013-7-22 14:20 编辑

对于基本数据类型int,要装箱成integer对象时,如果这个数字在一个字节之内,即-128到127,就会缓存起来,缓存到一个池里面。如果要把一个相同的数装成integer对象时,若缓存池里有这个对象,就把它返回,而不是创建新的对象,这样可以节省内存空间。100在这个范围内,所以当第二段代码给a赋100时,在缓存池里创建该对象,当给b赋100时,因为缓存池里有这个对象,就直接把它返回,a与b指向相同对象。第四段代码也是这个道理。第三段代码中156超出范围,所以给b赋值时新创建一个对象,a与b指向不同对象。
因为小的数据使用频率很高,它们的值又不改变,我们没有必要定义一个,就创建一个对象,这会消耗大量的空间。这是享元模式,它以共享的方式高效的支持大量的细粒度对象,大幅度的降低内存中对象的数量。比如,每天发短信,手指都累死了,但手机里有一个功能,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上名字就可以发送了,再不用一个字一个字敲了。

作者: 陈贺    时间: 2013-7-22 14:07
==符号,他比较的是一个对象在内存中的地址值, 1,3,4,都创建了对象内存地址都不同

作者: 陈贺    时间: 2013-7-22 14:08
陈贺 发表于 2013-7-22 14:07
==符号,他比较的是一个对象在内存中的地址值, 1,3,4,都创建了对象内存地址都不同
...

说错了是第一题和第3题
作者: yinjiek    时间: 2013-7-22 14:16
Integer a = 100;
Integer a = 156;因为Integer对象的取值范围为-128到127,所以156放不进去;
Integer a = Integer.valueOf(100);Integer中的值为100等效于a=100;
作者: tanzhiqiu    时间: 2013-7-23 05:47
代码片段1  integer b=100,相当于integer b=new integer(100);两个内存地址不同。
代码片段2
Integer ab度指向了同一个integer。因为当数值在byte范围里,对于新特性,如果该函数数值已经存在就不会在开辟内存空间。
代码片段3 中的数值已经超过byte的范围。
代码片段4 integer a = Integer.valueOf(100);
valueof返回一个表示指定的 int 值的 Integer 实例。相当于integera=100.
作者: iBadboy    时间: 2013-7-23 07:15
liuzhming 发表于 2013-7-22 13:59
对于基本数据类型int,要装箱成integer对象时,如果这个数字在一个字节之内,即-128到127,就会缓存起来, ...

很详细,很形象,真的多谢了
作者: iBadboy    时间: 2013-7-23 07:16
陈贺 发表于 2013-7-22 14:08
说错了是第一题和第3题

多谢,明白啦
作者: iBadboy    时间: 2013-7-23 07:16
yinjiek 发表于 2013-7-22 14:16
Integer a = 100;
Integer a = 156;因为Integer对象的取值范围为-128到127,所以156放不进去;
Integer a = ...

原来是超出范围才会建立新对象,多谢啦
作者: iBadboy    时间: 2013-7-23 07:17
tanzhiqiu 发表于 2013-7-23 05:47
代码片段1  integer b=100,相当于integer b=new integer(100);两个内存地址不同。
代码片段2
Integer ab ...

多谢啦。。。




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