黑马程序员技术交流社区

标题: 关于Integer数据比较的疑惑? [打印本页]

作者: 于汝国    时间: 2011-12-22 23:55
标题: 关于Integer数据比较的疑惑?
本帖最后由 于汝国 于 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

为什么三次的输出结果会有所不同?到底是什么原因?求详解......
作者: 袁泽宇    时间: 2011-12-23 00:02
本帖最后由 袁泽宇 于 2011-12-23 00:13 编辑

我输出的结果是:
true
false
true



对于整数类型装箱成为Integer对象的时候,如果数字在一个字节之内(-128~127),会先缓存起来,缓存成一个对象。如果数字相同时就直接用这个对象,不再创建新对象
作者: 闫江龙    时间: 2011-12-23 00:08
本帖最后由 闫江龙 于 2011-12-23 00:19 编辑

第一个和第二个不同是  数字小于128时 num1和num2是同一个对象  大于128时 num2就是一个新的对象 所以第二个是false   第三个也是相同的
作者: 闫江龙    时间: 2011-12-23 00:19
补充一下  
java中基本类型的包装类的大部分都实现了常量池技术,这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现。另外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用对象池,也即对象不负责创建和管理大于127的这些类的对象。整型在常量池里只能表示-128到127.超过这个范围的就不归常量池管
作者: 郝锡强    时间: 2011-12-23 00:22
第二个超出127范围,第三个貌似也是true吧,valueOf()方法是转化int的一个方法
作者: 王胜利    时间: 2011-12-23 08:54
valueOf是Integer类的一个静态方法,它是把一个string参数转换为Integer类型,那么经过Integer.valueOf("345")转换,345就是一个Integer类型了
运行结果为:
true
false
true
这些数字在一个字节之类也就是-128-127之间这些数字包装成一个Integer对象,就会把它缓存起来,下次如果再遇到此数字时候,直接从内存池中读取。 况且数字相同时就直接用这个对象,不再创建新对象 。故而,输入结果如上!

作者: 陈帅雷    时间: 2011-12-23 09:38
本帖最后由 陈帅雷 于 2011-12-23 09:40 编辑

享元模式
对于基本类型的整数要装箱成Integer对象的时候,如果这个数字在-128到127之间(即一个字节之内的数字),一旦包装成Integer对象后就会把这个对象缓存起来保存到一个池中,下次如果又要把一个整数装成一个Integer对象的时候,首先向这个池中找到,如果找到就仍然使用原来的对象,如果没找到就新new出来个,对于大于127的整数直接new一个
作者: 于汝国    时间: 2011-12-23 10:13
谢谢大家,明白了!




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