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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于汝国 黑马帝   /  2011-12-22 23:55  /  2916 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 于汝国 于 2011-12-23 10:13 编辑

Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1 == num2); 输出结果是:true

Integer num3 = 129;
Integer num4 = 129;
System.out.println(num3 == num4); 输出结果是:false

Integer num5 = Integer.valueOf(12);
Integer num6 = Integer.valueOf(12)  ;
System.out.println(num5 == num6); 输出结果是:false

为什么三次的输出结果会有所不同?到底是什么原因?求详解......

评分

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

查看全部评分

7 个回复

倒序浏览
本帖最后由 袁泽宇 于 2011-12-23 00:13 编辑

我输出的结果是:
true
false
true



对于整数类型装箱成为Integer对象的时候,如果数字在一个字节之内(-128~127),会先缓存起来,缓存成一个对象。如果数字相同时就直接用这个对象,不再创建新对象

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 闫江龙 于 2011-12-23 00:19 编辑

第一个和第二个不同是  数字小于128时 num1和num2是同一个对象  大于128时 num2就是一个新的对象 所以第二个是false   第三个也是相同的
回复 使用道具 举报
补充一下  
java中基本类型的包装类的大部分都实现了常量池技术,这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现。另外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用对象池,也即对象不负责创建和管理大于127的这些类的对象。整型在常量池里只能表示-128到127.超过这个范围的就不归常量池管

评分

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

查看全部评分

回复 使用道具 举报
第二个超出127范围,第三个貌似也是true吧,valueOf()方法是转化int的一个方法
回复 使用道具 举报
valueOf是Integer类的一个静态方法,它是把一个string参数转换为Integer类型,那么经过Integer.valueOf("345")转换,345就是一个Integer类型了
运行结果为:
true
false
true
这些数字在一个字节之类也就是-128-127之间这些数字包装成一个Integer对象,就会把它缓存起来,下次如果再遇到此数字时候,直接从内存池中读取。 况且数字相同时就直接用这个对象,不再创建新对象 。故而,输入结果如上!

评分

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

查看全部评分

回复 使用道具 举报
陈帅雷 黑马帝 2011-12-23 09:38:51
7#
本帖最后由 陈帅雷 于 2011-12-23 09:40 编辑

享元模式
对于基本类型的整数要装箱成Integer对象的时候,如果这个数字在-128到127之间(即一个字节之内的数字),一旦包装成Integer对象后就会把这个对象缓存起来保存到一个池中,下次如果又要把一个整数装成一个Integer对象的时候,首先向这个池中找到,如果找到就仍然使用原来的对象,如果没找到就新new出来个,对于大于127的整数直接new一个
回复 使用道具 举报
于汝国 黑马帝 2011-12-23 10:13:37
8#
谢谢大家,明白了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马