随着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