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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 烟花雨 中级黑马   /  2013-10-24 19:55  /  1173 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 烟花雨 于 2013-10-26 20:23 编辑

以下两种输出结果为何不同,困惑,求解答。。详细的
package it.cast.test;

public class AutoBoxDemo1 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Integer a=200;
                Integer b=200;
                if(a==b)
                        System.out.print("a==b");
                else
                        System.out.print("a!=b");
        }

}
//输出结果是:a!=b


package it.cast.test;

public class AutoBoxDemo1 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Integer a=100;
                Integer b=100;
                if(a==b)
                        System.out.print("a==b");
                else
                        System.out.print("a!=b");
        }

}
//输出结果是:a==b



评分

参与人数 1技术分 +1 收起 理由
李江 + 1 赞一个!

查看全部评分

7 个回复

正序浏览
总结:1.5之后,不用new基本数据类型的对象,直接赋值给基本数据类型。
-128~127之间的数,被放到一个池子里,可以共享
将大量重复使用的元素,进行共享的模式,称为“享元模式”。
元素中不同的部分,将作为方法的参数,进行操作

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报
享元模式
flyweight
如果很多很小的对象,它们有相同的东西,那就可以把它们变成一个对象,把它们不同的东西变成外部的属性,作为方法的参数传入
整数:-128~127  使用的是享元模式

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报
让享元模式在我们的代码中体现才是目的。
回复 使用道具 举报
一针见血回答你问题

JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,所以地址不一样。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼主你好,如果问题已解决请将帖子状态修改为提问结束,

如果未解决请继续提问,谢谢合作

修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
享元模式
flyweight
如果很多很小的对象,它们有相同的东西,那就可以把它们变成一个对象,把它们不同的东西变成外部的属性,作为方法的参数传入
整数:-128~127  使用的是享元模式

评分

参与人数 1技术分 +1 收起 理由
李江 + 1 赞一个!

查看全部评分

回复 使用道具 举报
当Integer a。当赋值为byte区间时-128~127指向的是同一个对象,超出这个区间就相当于两个对象了。
原理貌似是虚拟机中对-128~127底层是存在的,在此区间都指向同一个地址值。
因为超出那个范围,像你这样赋值属于两个对象,有两个地址值。跟String类是不同的。

评分

参与人数 1技术分 +1 收起 理由
李江 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马