黑马程序员技术交流社区
标题:
关于Integer的疑问
[打印本页]
作者:
孙妍娜
时间:
2014-7-10 22:09
标题:
关于Integer的疑问
以下代码,为什么输出的是i1==i2,i3!=i4?求指教。
public static void main(String[] args)
{
Integer i1=100;
Integer i2=100;
if(i1==i2)
{
System.out.println("i1==i2");
}
else
{
System.out.println("i1!=i2");
}
Integer i3=200;
Integer i4=200;
if(i3==i4)
{
System.out.println("i3==i4");
}
else
{
System.out.println("i3!=i4");
}
}
作者:
淡夜清风
时间:
2014-7-10 22:33
对于基本类型的整数,要装箱称为Integer对象的时候,如果这个数字在一个字节之内(-128-127),把它包装成一个Integer对象后,会把它缓存起来,缓存到一个池里面。下次又要把一个数字当成Integer对象的时候,先去看池里面有没有这个数字,有的话就直接拿了。这样就节省了内存空间。
因为比较小的整数,使用的频率会很高。会反复的出现。如果一出现就装成一个对象,那么对象就会越来越多。对象本来就是不怎么改变的,粒度又很小,对象也很小。
大家都去用它,而不去改变它的数据,没必要每个数字都对应一个对象。只要有一个这样的对象就可以了,大家都来使用这个对象。这是一种设计模式。叫享元模式。
--------------------
Integer i1=100; //这里的i1被赋值为100,在(-128-127)之间的数。
所以100会被封装成对象被缓存到一个池里面。
当程序执行到 Integer i2=100的时候,先去看池里面有没有100这个数字。当然是有的啦。。所以直接从池子里面取了,而不需要再去封装对象了。因此i1和i2所引用的都是同一个对象。所以i1==i2。
-------------------
上面的解释你明白了,i3!=i4你也就明白啦。。
作者:
卞新浩
时间:
2014-7-10 22:39
2楼解释的好清楚呀 赞个
作者:
hxwo211314
时间:
2014-7-10 23:31
2楼解释的很清楚啦,我也不说什么了。
作者:
杨冬冬
时间:
2014-7-10 23:58
这里是不是涉及到Integer的装箱和拆箱的原理吗
作者:
孙妍娜
时间:
2014-7-11 20:19
淡夜清风 发表于 2014-7-10 22:33
对于基本类型的整数,要装箱称为Integer对象的时候,如果这个数字在一个字节之内(-128-127),把它包装成 ...
很清楚呢,明白了,非常感谢。
作者:
霜林醉zhx
时间:
2014-7-11 20:34
127和128的问题,毕老师的视频里讲得很清楚
作者:
215041631
时间:
2014-7-11 21:25
我记得是在127-128的范围内,INTEGER类型的数会跟字符串常量池类似的引用
作者:
xiaobo
时间:
2014-7-11 21:36
淡夜清风 发表于 2014-7-10 22:33
对于基本类型的整数,要装箱称为Integer对象的时候,如果这个数字在一个字节之内(-128-127),把它包装成 ...
解释很到位 赞...
作者:
╮福尔摩斯`
时间:
2014-7-11 22:21
2楼不愧是那么高等级的
作者:
歸羽
时间:
2014-7-11 23:09
很详细的解释,学习了~
作者:
裤裆里的温柔、
时间:
2014-7-11 23:25
楼上正解
作者:
scenery_sky
时间:
2014-7-11 23:44
享元模式
作者:
cheye0207
时间:
2014-7-12 02:41
呵呵,又复习了一次享无模式
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2