随着jdk的变更,有一些代码执行的结果也就不同了,下面说一下string的问题,若是看到下面代码有没见过的方法,请先看看https://my.oschina.net/xpbob/blog/746488。java
String str = new String(new char[]{'a','b'}); str.intern(); String str1 ="ab";
若是在你熟悉API和string常量池的解析后,认为是str==str1为flase的请往下看。jvm
在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.net