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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© slatop@qq.com 中级黑马   /  2013-5-29 15:13  /  1324 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

 大家都知道在1.5的JDK后增加了一个自动装箱的新特性,通过这个新特性可以将一个基础类型自动封闭为包装类,如 Integer numObj = 5;
 这种新特性,其实在C++中被称之为隐匿构造,其原来是在Integer numObj = 5这样的语句在编译器编译时展开为Integer numObj = Integer(5); 而在Integer中有一个带一个参数的构造函数,如Integer(int num){...}.在java在对象只能开在堆中,所以Integer numObj = Integer(5);这样直接将对象开在栈中的构造方式不能出现在java中。但从中可以看到,其原理如同 Integer numObj = new Integer(5);而已。
 但在这个新特殊中,我发现一个很有趣的事,如果你的程序有如下两行代码。

 int num = 1;
 Integer numObj = 1;

那么你将会发现 num == numObj 的结果为true;
为什么会这样的。测试了一下发现,结果如图。




大家都知道
String str1 = "abc";
String str2 = "abc";
str1 == str2  为true ;

其原理也如上面一样,是java中的一个基础类型缓存导致的。
java中将一个所用到的基本类型以最小单位(字节)储存,然后在下一次如果有非堆中对象再次使用这个单位时,自动将变量指向这个对象,注意是变量不是引用,引用是代表一个类的,他内部的数据本身还是存在变量的。

但在这个测试中发现,如果是用new创建出来的内存空间,也就是直接在堆中开辟空间得到的数据并非是直接从这个缓存中拿的,想想也应该是这样,否则一个堆中对象引用了一个栈中数据,当栈中数据超出作用域堆中的对象成员就再也找不到这块内存了。但是如果是这样的话。包装类,如Integer num = 5;这个5到底是在堆中还是栈中呢。有时间的朋友研究一下共享结果吧。

评分

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

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马