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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© bird_not_fat 中级黑马   /  2013-10-15 13:13  /  2035 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 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的结果,求解!!!
               

评分

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

查看全部评分

10 个回复

倒序浏览
本帖最后由 赖波 于 2013-10-15 13:38 编辑

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

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 黑马戴帅军 于 2013-10-15 14:09 编辑

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

这个好像不是字符串常量池吧,应该是缓冲池~嘿嘿
回复 使用道具 举报
赖波 发表于 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:44
地板
  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

评分

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

查看全部评分

回复 使用道具 举报
FFF 发表于 2013-10-15 13:51
Integer i1 = 3;
建立一个值为3名字为i1的变量引用,3的内存地址为000X30
Integer i2 = new Integer(3);

内存地址是怎么得到的啊~
回复 使用道具 举报
赖波 中级黑马 2013-10-15 14:05:14
8#
bird_not_fat 发表于 2013-10-15 13:50
那 Integer i1 = 135;
   Integer i2 = 135;
  i1 == i2 返回false是为什么呢?原理是什么求解 ...

Integer也有范畴-128~127之间,因为要小对象,超出就不放入缓冲池中了
回复 使用道具 举报
bird_not_fat 发表于 2013-10-15 13:48
这个好像不是字符串常量池吧,应该是缓冲池~嘿嘿

嗯嗯,弄混了。
回复 使用道具 举报
赖波 发表于 2013-10-15 14:05
Integer也有范畴-128~127之间,因为要小对象,超出就不放入缓冲池中了

超出不放在缓冲池中那放在哪啊?堆内存中么?
回复 使用道具 举报
To 金牌黑马 2013-10-15 18:17:46
11#
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马