一個或兩個。如果字符串常量池已經(jīng)有“xyz”,則是一個;否則,兩個。
當字符創(chuàng)常量池沒有 “xyz”,此時會創(chuàng)建如下兩個對象:
一個是字符串字面量 "xyz" 所對應的、駐留(intern)在一個全局共享的字符串常量池中的實例,此時該實例也是在堆中,字符串常量池只放引用。
另一個是通過 new String() 創(chuàng)建并初始化的,內(nèi)容與"xyz"相同的實例,也是在堆中。
String s = "xyz" 和 String s = new String("xyz") 區(qū)別?兩個語句都會先去字符串常量池中檢查是否已經(jīng)存在 “xyz”,如果有則直接使用,如果沒有則會在常量池中創(chuàng)建 “xyz” 對象。
另外,String s = new String("xyz") 還會通過 new String() 在堆里創(chuàng)建一個內(nèi)容與 "xyz" 相同的對象實例。
所以前者其實理解為被后者的所包含。