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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙妍娜 中级黑马   /  2014-7-10 22:09  /  1848 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

以下代码,为什么输出的是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");
                }
        }

评分

参与人数 1技术分 +1 收起 理由
淡夜清风 + 1 赞一个!

查看全部评分

13 个回复

倒序浏览
对于基本类型的整数,要装箱称为Integer对象的时候,如果这个数字在一个字节之内(-128-127),把它包装成一个Integer对象后,会把它缓存起来,缓存到一个池里面。下次又要把一个数字当成Integer对象的时候,先去看池里面有没有这个数字,有的话就直接拿了。这样就节省了内存空间。
因为比较小的整数,使用的频率会很高。会反复的出现。如果一出现就装成一个对象,那么对象就会越来越多。对象本来就是不怎么改变的,粒度又很小,对象也很小。
大家都去用它,而不去改变它的数据,没必要每个数字都对应一个对象。只要有一个这样的对象就可以了,大家都来使用这个对象。这是一种设计模式。叫享元模式。
--------------------
Integer i1=100; //这里的i1被赋值为100,在(-128-127)之间的数。
所以100会被封装成对象被缓存到一个池里面。
当程序执行到 Integer i2=100的时候,先去看池里面有没有100这个数字。当然是有的啦。。所以直接从池子里面取了,而不需要再去封装对象了。因此i1和i2所引用的都是同一个对象。所以i1==i2。
-------------------
上面的解释你明白了,i3!=i4你也就明白啦。。
回复 使用道具 举报
2楼解释的好清楚呀  赞个
回复 使用道具 举报
2楼解释的很清楚啦,我也不说什么了。
回复 使用道具 举报
这里是不是涉及到Integer的装箱和拆箱的原理吗
回复 使用道具 举报
淡夜清风 发表于 2014-7-10 22:33
对于基本类型的整数,要装箱称为Integer对象的时候,如果这个数字在一个字节之内(-128-127),把它包装成 ...

很清楚呢,明白了,非常感谢。
回复 使用道具 举报
127和128的问题,毕老师的视频里讲得很清楚
回复 使用道具 举报
我记得是在127-128的范围内,INTEGER类型的数会跟字符串常量池类似的引用
回复 使用道具 举报
xiaobo 中级黑马 2014-7-11 21:36:26
9#
淡夜清风 发表于 2014-7-10 22:33
对于基本类型的整数,要装箱称为Integer对象的时候,如果这个数字在一个字节之内(-128-127),把它包装成 ...

解释很到位  赞...
回复 使用道具 举报
2楼不愧是那么高等级的
回复 使用道具 举报
很详细的解释,学习了~
回复 使用道具 举报
楼上正解
回复 使用道具 举报
scenery_sky 来自手机 中级黑马 2014-7-11 23:44:46
13#
享元模式
回复 使用道具 举报
呵呵,又复习了一次享无模式
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马