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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在张老师的Java基础加强这个地方看的有点模糊,下面代码的结果为什么一个为true一个为false???
  1. public class Test02
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Integer i1 = 13 ;
  6.                 Integer i2 = 13 ;
  7.                 System.out.println(i1==i2);                //结果为true
  8.                
  9.                 Integer i3 = 137 ;
  10.                 Integer i4 = 137 ;
  11.                 System.out.println(i3==i4);                //结果为false
  12.         }
  13. }
复制代码

6 个回复

倒序浏览
自动装箱时(-128~127)会共用一个对象。
享元模式 (flyweight)
有很多小的对象,他们的很多属相相同,把他们变成一个对象。相同的为内部属性,不同的为外部属性。

评分

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

查看全部评分

回复 使用道具 举报
-128-127因为常用,所以java将他放在一个共享内存中,所有对象共享这个区间数据,大于这个区间的数据,为各个对象私有
回复 使用道具 举报
xuehuayous 发表于 2014-3-28 19:54
自动装箱时(-128~127)会共用一个对象。
享元模式 (flyweight)
有很多小的对象,他们的很多属相相同,把 ...

谢谢你的回答!!!
回复 使用道具 举报
青木郎 发表于 2014-3-28 19:59
-128-127因为常用,所以java将他放在一个共享内存中,所有对象共享这个区间数据,大于这个区间的数据,为各 ...

谢谢回答!!!
回复 使用道具 举报
基本数据的自动拆装箱及享元设计模式

    自动拆装箱:

       自动拆箱:把引用类型转变为值类型

       自动装箱:把值类型转变为引用类型

    享元模式:

       很多小的对象,他们有很多相同的属性,那么我们把它们作为一个对象,他们相同的属性我们叫内部状态;若他们很多对象的属性不同,那我们把它们的属性作为方法的参数,我们叫这些属性为外部状态

例:
  1. public class AutoBox {

  2.     public static void main(String[] args) {

  3.        Integer iObj = 3;

  4.        System.out.println(iObj + 12);  //自动拆箱

  5.        String s1 = "abc";

  6.        String s2 = "abc";

  7.        System.out.println("s1和s2是否指向同一对象:" + (s1 == s2));

  8.        Integer i1 = 13; //自动装箱,将int类型13自动封装成Ingeger类型

  9.        Integer i2 = 13;

  10.        System.out.println("i1和i2是否指向同一对象:" + (i1 == i2));

  11.        Integer i1a = 133;

  12.        Integer i2a = 133;

  13.        System.out.println("i1a和i2a是否指向同一对象:" + (i1a == i2a));

  14.        Integer i3 = Integer.valueOf(3);

  15.        Integer i4 = Integer.valueOf(3);

  16.        System.out.println("i3和i4是否指向同一对象:" + (i3 == i4));

  17.        Integer i3a = Integer.valueOf(423);

  18.        Integer i4a = Integer.valueOf(423);

  19.        System.out.println("i3a和i4a是否指向同一对象:" + (i3a == i4a));

  20.     }

  21. }

复制代码


运行结果:

15

s1和s2是否指向同一对象:true

i1和i2是否指向同一对象:true

i1a和i2a是否指向同一对象:false

i3和i4是否指向同一对象:true

i3a和i4a是否指向同一对象:false

这里可以看得到i1和i2比较,地址值相同,但i1a和i2a比较,地址值都不同!在这里用到了享元设计模式,当i1值与i2基本数值要装箱成Integer类型时,如果这个值在一个字节之内(-128~127),系统就会将这个数值存起来,放在一个缓冲池里,当要创建下一个数对象时,会到缓冲池中搜索这个值,如果有这个值,值引用指向这个对象,这样就能节省对象空间,降低系统消耗。

当超过了一个字节所能表示的范围,就会成为false,因为可能一个字节里值了出现的频率比较高!

评分

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

查看全部评分

回复 使用道具 举报
你好!默默 发表于 2014-3-28 21:28
基本数据的自动拆装箱及享元设计模式

    自动拆装箱:

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