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