黑马程序员技术交流社区
标题:
Integer中的疑问
[打印本页]
作者:
耿渊博
时间:
2014-3-29 17:58
标题:
Integer中的疑问
本帖最后由 耿渊博 于 2014-3-31 10:15 编辑
a==b,一般是判断对象地址的,为什么会出现下面情况
package com.Thread;
public class IntegerDemo {
public static void sop(Object obj){
System.out.println(obj);
}
public static void main(String[] args) {
Integer m = 128;
Integer n = 128;
sop("m==n:"+(m==n) );//false
Integer a = 127;
Integer b = 127;
sop("a==b:"+(a==b));//true
}
}
复制代码
结果:第一个为false
第二个为true
作者:
苏伯亚
时间:
2014-3-29 18:11
Integer有取值范围为-128~127 符合值范围时候,进入创建好的静态IntergerCache管理区中,去取值,所以比较值位置真; 当不符合-128 127值范围时候。开辟新的内存空间,不属于IntergerCache管理区,就不想等了。也就是假。
作者:
xuehuayous
时间:
2014-3-29 18:22
自动装箱时(-128~127)会共用一个对象。
享元模式 (flyweight)
有很多小的对象,他们的很多属相相同,把他们变成一个对象。相同的为内部属性,不同的为外部属性。
希望对你有帮助!
作者:
zhangbingyuan
时间:
2014-3-29 18:25
本帖最后由 zhangbingyuan 于 2014-3-29 18:26 编辑
Java中的Integer是有个常量池的概念的,如果Integer对象装箱的int类型的值介于-128~127之间,那么当建立这个int类型数据的Integer对象的时候,它就会存在于常量池中,下次再要建立值介于-128~127之间的Integer对象的时候,就会常量池中去找,如果存在具有相同值的Integer对象,那么新建立的Integer对象就会指向常量池中已经存在的那个Integer对象,也就是说不会再新建一个Integer对象。当然如果 要封装的int类型的值不再上述那个范围的话,就会另外new一个Integer对象。所以根据这种机制,才会产生你那种运行结果。
作者:
小班。
时间:
2014-3-30 12:31
public class IntegerDemo {
public static void sop(Object obj){
System.out.println(obj);
}
//Integer对象有一个常量池, Integer m = 128这个语句会吧int类型的128自动封箱成Integer对象
//Integer对象装箱的int类型的值介于-128~127之间创建且只创建一个对象。以后如果还有用这个范围里的对象时
//都会直接在常量池中找,不会再创建新的。如果超出范围,就会另外创建对象,有几个创建几个。
public static void main(String[] args) {
//Integer m = 128这个语句会吧int类型的128自动封箱成Integer对象
Integer m = 128;
Integer n = 128;
//很明显。128超出了范围,所以会为m创建一个Integer对象,为n另外创建一个Integer对象
//即两个对象不是同一个对象,即对象的地址不同
sop("m==n:"+(m==n) );//false
Integer a = 127;
Integer b = 127;
//127在-128~127范围之间。所以在为a创建了一个Integer对象后,再为b创建对象时,
//会现在常量池中寻找是否存在内部封装int值为127的对象,存在,就直接拿来用
//即在这里,a、和b指向的是同一个对象,也是同一个地址。
sop("a==b:"+(a==b));//true
}
}
复制代码
作者:
雪碧拌米饭
时间:
2014-3-30 12:40
Integer在内存只分配一个字节,一个字节的有效值范围为-128~127,128超出了这个范围,吗m,n执行不同的对象
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2