最近有遇到相關(guān)面試題,記錄一下。
java中String s = new String("abc")創(chuàng)建了幾個(gè)對(duì)象脯颜?毒姨!
答案是兩個(gè),現(xiàn)在我們具體的說(shuō)一下:
String s = new String("abc");
首先我們要明白兩個(gè)概念廉油,引用變量和對(duì)象碰声,對(duì)象一般通過(guò)new在堆中創(chuàng)建跟啤,s只是一個(gè)引用變量乃沙。
所有的字符串都是String對(duì)象起趾,由于字符串文字的大量使用,java中為了節(jié)省時(shí)間警儒,在編譯階段训裆,會(huì)把字符串文字放在文字池中,文字池的一個(gè)好處就是可以把相同的字符串合并蜀铲,占用一個(gè)空間边琉,我們可以用==判斷一下兩個(gè)引用變量是否指向了一個(gè)地址即一個(gè)對(duì)象。
public static void main(String[] args){
String s1 ="abc";
String s2 = "abc" ;
if( s1 == s2 ) System.out.println("s1,s2 refer to the same object");
else System.out.println("trouble");
}
輸出結(jié)果為:s1,s2 refer to the same object记劝。
可以看出指向了一個(gè)對(duì)象变姨,即文字池中保存了一個(gè)對(duì)象。
二隆夯、String s = new String("abc")實(shí)際上是"abc"本身就是文字池中的一個(gè)對(duì)象钳恕,在運(yùn)行 new String()時(shí),把文字池即pool中的字符串"abc"復(fù)制到堆中蹄衷,并把這個(gè)對(duì)象的引用交給s忧额,所以創(chuàng)建了兩個(gè)String對(duì)象,一個(gè)在pool 中愧口,一個(gè)在堆中睦番。下面看這個(gè)程序,創(chuàng)建了幾個(gè)對(duì)象耍属。
public static void main(String[] args){
String s1 = new String("abc");
String s2 = new String("abc");
if (s1 == s2) { //不會(huì)執(zhí)行的語(yǔ)句}
System.out.println("在堆中創(chuàng)建了一個(gè)對(duì)象");
} else {
System.out.println("在堆中創(chuàng)建了兩個(gè)對(duì)象");
}
}
輸出結(jié)果為:在堆中創(chuàng)建了兩個(gè)對(duì)象
可知在堆中創(chuàng)建了兩個(gè)對(duì)象托嚣,但是在文字池中有一個(gè)對(duì)象,所以共創(chuàng)建了三個(gè)對(duì)象厚骗。
三示启、再看下一個(gè)例子:
public static void main(String[] args){
String s = new String("abc");
s = "cba";
System.out.println(s);
}
輸出結(jié)果為:cba
String s = new String("abc")是把文字池即pool中的字符串"abc"復(fù)制到堆中,s=并不是給s賦值领舰,而是把堆中的"abc"對(duì)象的引用交給s持有夫嗓,現(xiàn)在把s指向字符串pool中的"cba"對(duì)象,"cba"的引用地址把"abc"的引用地址覆蓋冲秽,所以輸出結(jié)果為cba舍咖。