這道Java基礎面試題你真的會嗎?

你咱不往下看,先想一想你的答案是什麼?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"字符串的解釋貌似有些牽強,下面再來證明一下。

相關文章
相關標籤/搜索