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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© iBadboy 中级黑马   /  2013-7-22 13:22  /  1334 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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


评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
本帖最后由 liuzhming 于 2013-7-22 14:20 编辑

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

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
==符号,他比较的是一个对象在内存中的地址值, 1,3,4,都创建了对象内存地址都不同
回复 使用道具 举报
陈贺 发表于 2013-7-22 14:07
==符号,他比较的是一个对象在内存中的地址值, 1,3,4,都创建了对象内存地址都不同
...

说错了是第一题和第3题
回复 使用道具 举报
Integer a = 100;
Integer a = 156;因为Integer对象的取值范围为-128到127,所以156放不进去;
Integer a = Integer.valueOf(100);Integer中的值为100等效于a=100;

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
代码片段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.
回复 使用道具 举报
liuzhming 发表于 2013-7-22 13:59
对于基本数据类型int,要装箱成integer对象时,如果这个数字在一个字节之内,即-128到127,就会缓存起来, ...

很详细,很形象,真的多谢了
回复 使用道具 举报
陈贺 发表于 2013-7-22 14:08
说错了是第一题和第3题

多谢,明白啦
回复 使用道具 举报
yinjiek 发表于 2013-7-22 14:16
Integer a = 100;
Integer a = 156;因为Integer对象的取值范围为-128到127,所以156放不进去;
Integer a = ...

原来是超出范围才会建立新对象,多谢啦
回复 使用道具 举报
tanzhiqiu 发表于 2013-7-23 05:47
代码片段1  integer b=100,相当于integer b=new integer(100);两个内存地址不同。
代码片段2
Integer ab ...

多谢啦。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马