你咱不往下看,先想一想你的答案是什麼?java
這裏先來聊聊String的intern()方法是幹什麼的?ide
intern方法是一個native方法,空口無憑,我們仍是能夠看看Stirng的源碼ui
從方法的註釋我們能夠知道,它的做用:對象
1:若是字符串常量池中已經包含一個等於此Stirng對象的字符串,則返回表明池中的這個字符串的String對象,blog
2:第一條不成立。則將此String對象包含的字符串添加到常量池中,而且返回此String對象的引用字符串
再回到上面的題目,答案有兩種,源碼
1:若是jdk版本爲1.6時,會打印出兩個falseit
2:若是jdk版本是大於等於1.7的話,打印出來的是true和false各一個class
爲何會這樣呢????jdk
第一,jdk1.6中intern方法會把首次遇到的字符串實例複製到永久代,返回的也是永久代中這個字符串的引用,而且StringBuilder建立字符串實例是在堆上,因此必然不是同一個引用,因此致使都是false。
第二,jdk1.7中intern方法的實現不會再複製實例,只是在常量池中記錄首次出現的實例引用,所以intern方法返回的引用和StirngBuilder建立的那個字符串實例是同一個,對於str2中比較返回false是由於"java"這個字符串在執行StirngBuilder.toString()以前已經出現過了,字符串常量池中已經有它的引用了,不符合首次出現的原則,而"計算機軟件"這個字符串則是首次出現的,所以返回true。
在上面的第二條中的"java"字符串的解釋貌似有些牽強,下面再來證明一下。