Java String 补充

        随着jdk的变动,有一些代码执行的结果也就不一样了,下面说一下string的问题,如果看到下面代码有没见过的方法,请先看看https://my.oschina.net/xpbob/blog/746488。

	          String str = new String(new char[]{'a','b'});
	          str.intern();
	          String str1 ="ab";

        如果在你熟悉API和string常量池的解析后,认为是str==str1为flase的请往下看。

        在1.7之前这个代码str和str1是不相等的,但是从1.7开始,这个str和str1地址相等了。在1.7之前,字符串常量池是在方法区中,new出来的对象在堆,调用Intern方法肯定是在字符串常量池中新建了一个对象,但是jvm为了避免字符串常量池那边oom,1.7开始把字符串常量池移入到了堆内存,在常量池没有ab字符串的时候,str.intern()方法会让常量池拿到堆里对象的引用,并没有新建一个对象,所以str1指向的对象就和str指向的对象相同了。这个可以直接在调试的时候查看对象ID来检测,或者使用hsdb来查看内存来验证。下面推荐一篇解析了intern,native代码的博客,帮助理解。http://brokendreams.iteye.com/blog/2260870

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值