黑马程序员技术交流社区

标题: 关于装箱和拆箱的小问题 [打印本页]

作者: 烟花雨    时间: 2013-10-24 19:55
标题: 关于装箱和拆箱的小问题
本帖最后由 烟花雨 于 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




作者: 寻丶丶觅    时间: 2013-10-24 20:14
当Integer a。当赋值为byte区间时-128~127指向的是同一个对象,超出这个区间就相当于两个对象了。
原理貌似是虚拟机中对-128~127底层是存在的,在此区间都指向同一个地址值。
因为超出那个范围,像你这样赋值属于两个对象,有两个地址值。跟String类是不同的。
作者: 月夜之鬼魅    时间: 2013-10-24 20:36
享元模式
flyweight
如果很多很小的对象,它们有相同的东西,那就可以把它们变成一个对象,把它们不同的东西变成外部的属性,作为方法的参数传入
整数:-128~127  使用的是享元模式

作者: 乔兵    时间: 2013-10-26 14:20
楼主你好,如果问题已解决请将帖子状态修改为提问结束,

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

修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
作者: 麦子    时间: 2013-10-26 15:33
一针见血回答你问题

JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,所以地址不一样。
作者: 0从谷0    时间: 2013-10-26 16:44
让享元模式在我们的代码中体现才是目的。
作者: 月夜之鬼魅    时间: 2013-10-26 19:11
享元模式
flyweight
如果很多很小的对象,它们有相同的东西,那就可以把它们变成一个对象,把它们不同的东西变成外部的属性,作为方法的参数传入
整数:-128~127  使用的是享元模式

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






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