黑马程序员技术交流社区

标题: 关于封装类的享元模式 [打印本页]

作者: bird_not_fat    时间: 2013-10-15 13:13
标题: 关于封装类的享元模式
本帖最后由 杨增坤 于 2013-10-16 09:31 编辑

public class ShareMetaDemo {
        public static void main(String[] args) {
                Integer i1 = 3;
                Integer i2 = new Integer(3);
                Integer i3 = 3;        
                System.out.println(i1 == i2);
                System.out.println(i1 == i3);
        }
}
为什么得到 false,和 true的结果,求解!!!
               
作者: 赖波    时间: 2013-10-15 13:34
本帖最后由 赖波 于 2013-10-15 13:38 编辑

  Integer i1 = 3;
   Integer i2 = new Integer(3);
虽然Integer i1为3这个对象放到一个缓冲池中,但
i2因为你new 了,代表重新开辟了一个空间,i2就用不到亨元,不用缓冲池中的对象
i3将用缓冲池中的对象3
所以有你这样的结果
当然我们得了解享元模式.:
一个对象很小,又在多个地方使用,并且对它的使用都是一样的,这时就可以只创建一个这样的对象,其他地方使用时,也都使用这个对象.这种思想就是享元模式.
Integer也有范畴-128~127之间,因为要小对象,超出就不放入缓冲池中了

作者: 黑马戴帅军    时间: 2013-10-15 13:35
本帖最后由 黑马戴帅军 于 2013-10-15 14:09 编辑

创建一个缓冲池中的对象i1并且赋值为3
通过new对象创建对象是在堆内存中创建的。
==比较的是两端内容的地址值是否相等
i1和i3同处于同一个字符串缓冲池中。而i2的则处于堆内存中,
作者: bird_not_fat    时间: 2013-10-15 13:48
黑马戴帅军 发表于 2013-10-15 13:35
创建一个常量池中的对象i1并且赋值为3
通过new对象创建对象是在堆内存中创建的。
==比较的是两端内容的地址 ...

这个好像不是字符串常量池吧,应该是缓冲池~嘿嘿
作者: bird_not_fat    时间: 2013-10-15 13:50
赖波 发表于 2013-10-15 13:34
Integer i1 = 3;
   Integer i2 = new Integer(3);
虽然Integer i1为3这个对象放到一个缓冲池中,但

那 Integer i1 = 135;
   Integer i2 = 135;
  i1 == i2 返回false是为什么呢?原理是什么求解
作者: FFF    时间: 2013-10-15 13:51
  1.                 Integer i1 = 3;
  2.                 Integer i2 = new Integer(3);
  3.                 Integer i3 = 3;      
  4.                 System.out.println(i1 == i2);
  5.                 System.out.println(i1 == i3);
复制代码
Integer i1 = 3;
建立一个值为3名字为i1的变量引用,3的内存地址为000X30
Integer i2 = new Integer(3);
使用了new新建立一个值为i3内的内容,名字为i2的变量引用,3的内存地址为新地址000D3d
Integer i3 = 3;
建立一个值为3名字为i3的变量引用,3的内存地址为000X30(内存与i1一致)
使用==是比较两个的内存值.使用equals则是比较内容是否一致!
equals的使用格式:i1.equals(i2)
输出
  1. System.out.println(i1.equals(i2));
复制代码
结果为true
作者: bird_not_fat    时间: 2013-10-15 13:56
FFF 发表于 2013-10-15 13:51
Integer i1 = 3;
建立一个值为3名字为i1的变量引用,3的内存地址为000X30
Integer i2 = new Integer(3);

内存地址是怎么得到的啊~
作者: 赖波    时间: 2013-10-15 14:05
bird_not_fat 发表于 2013-10-15 13:50
那 Integer i1 = 135;
   Integer i2 = 135;
  i1 == i2 返回false是为什么呢?原理是什么求解 ...

Integer也有范畴-128~127之间,因为要小对象,超出就不放入缓冲池中了
作者: 黑马戴帅军    时间: 2013-10-15 14:09
bird_not_fat 发表于 2013-10-15 13:48
这个好像不是字符串常量池吧,应该是缓冲池~嘿嘿

嗯嗯,弄混了。
作者: bird_not_fat    时间: 2013-10-15 14:40
赖波 发表于 2013-10-15 14:05
Integer也有范畴-128~127之间,因为要小对象,超出就不放入缓冲池中了

超出不放在缓冲池中那放在哪啊?堆内存中么?
作者: To    时间: 2013-10-15 18:17
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html




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