問:下圖1、2的結果分別是什麼?
答:1=true、2=false。
String:intern()
是一個本地方法,它會查找字符串常量池中具有相同內容的String常量對象,如果沒有找到,則將自身包含的字符串添加到常量池中,並返回此String對象的引用。因此第一次調用"alibaba".inetrn()
會把"alibaba"字符串對象添加至常量池,並返回該對象的引用,圖1的判斷換過來說就是同一個引用對象在進行對比,所以返回true。
圖二的重點在於這裏其實是兩個不同的引用對象在判斷。Java程序在啓動的時候會加載類sun.misc.Version
,該類有一個屬性值爲java
的字符串會被添加進常量池中。因此在調用str.intern()
方法時,由於常量池中已經存在java
的引用對象,所以是兩個不同的引用對象在進行判斷,結果爲false。
如果圖一處再增加new String("alibaba")==str1.intern()
的判斷,和圖二同樣的道理,結果爲false。