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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯晓骏 中级黑马   /  2013-11-26 22:16  /  1639 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我们知道在基本数据类型的自动装箱中体现了享元设计模式
例如
Integer x = 1;
Integer y = 1;
那么x和y其实是同一个对象
我在想如果只是基本数据类型
比如
x = 1;
y = 1;
那么x和y的地址值是否是一致的,因为基本数据类型的地址值没办法获得,所以我也不知道怎么测试,有人能给解释下我的疑惑么

评分

参与人数 2技术分 +1 黑马币 +5 收起 理由
滔哥 + 1
枫儿 + 5

查看全部评分

8 个回复

倒序浏览
基本类型和引用类型不同,基本类型直接赋值,引用类型是把引用地址赋值给变量

评分

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

查看全部评分

回复 使用道具 举报
比较好办,用==就可以比较是否是一个对象,true是一个,false不是一个

评分

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

查看全部评分

回复 使用道具 举报
X和Y是存在栈内存中的
你要问
x = 1;
y = 1;
的地址值是否相同,我可以回答你:不相同
但是x和y指向的堆内存空间是一致的,(把1看成持有的内存地址值),但是他们自身在栈内存中的地址肯定是不一致的

评分

参与人数 1黑马币 +3 收起 理由
简★零度 + 3 赞一个!

查看全部评分

回复 使用道具 举报
Jim-剣◆﹏ 发表于 2013-11-26 22:57
X和Y是存在栈内存中的
你要问
x = 1;

你这个回答比较靠谱,也就是说,把1看成是一个整形常量,在一个常量池中放着,然后栈中的基本数据类型同时指向这个常量池中的地址,如果是基本数据类型的对象,则放在堆中,堆中的对象如果是针对同一个具有享元模式的值,那么无论这个对象有多少,只是代表它有多个名字,但堆内存中之存在一个对象,是这样么
回复 使用道具 举报
冯晓骏 发表于 2013-11-27 00:32
你这个回答比较靠谱,也就是说,把1看成是一个整形常量,在一个常量池中放着,然后栈中的基本数据类型同 ...

说对80%,要纠正你的一点是:堆中的对象如果是针对同一个具有享元模式的值,这个值是有限制的,有一定的范围的,并不是指所有的值都是在常量池中,如Integer的值在0~128范围内,则Integer的值是直接从常量池里取,如果超出这个范围,那么久在堆内存中new一个对象出来。
这里就扯出了为什么会出现享元模式和享元模式到底解决什么问题了
经过大量的统计和计算,Integer的取值绝大部分集中在0~128范围内,所以,为了节省空间,提高内存的利用效率,就把0~128放到常量池中,新建Integer时,如果在这个范围内疚直接取得引用就可以,不用再在堆内存中单独开辟空间
其他的享元模式的思想也是如此

评分

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

查看全部评分

回复 使用道具 举报
Jim-剣◆﹏ 发表于 2013-11-27 09:08
说对80%,要纠正你的一点是:堆中的对象如果是针对同一个具有享元模式的值,这个值是有限制的,有一定的 ...

好的,我理解你的说法,谢谢你,并且也纠正你一个小小的错误,整型常量放在常量池的范围应该是-128~127吧~~
回复 使用道具 举报
冯晓骏 发表于 2013-11-27 14:49
好的,我理解你的说法,谢谢你,并且也纠正你一个小小的错误,整型常量放在常量池的范围应该是-128~127吧 ...

哈哈...:handshake这下印象深刻了
回复 使用道具 举报
何超 中级黑马 2013-11-27 23:18:45
9#
对于基本数据类型 不管你是多少 只要两个值相同就会相等
如 int a=555  int b= 555    a==b 返回true
享元模式对应的是包装形式 在一个byte的范围内的所有值都被放在常量池中了
比如 Integer a=555   Integer  b=555 a==b 返回false
但是  Integer a=127  Integer b=127 a==b则返回true
再比如 Integer a=555 int b=555 a==b 则返回true
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马