更新時間:2020-04-27 14:13:36 來源:動力節(jié)點(diǎn) 瀏覽3198次
掌握下面的幾點(diǎn),所有的字符串面試題就不在是什么問題了:
注:本文以JDK8說明,至于JVM在每個版本的變化會在JVM面試庫中詳細(xì)介紹,在這就不展開了。
第一點(diǎn):字符串創(chuàng)建有兩種方式:字面量和利用new關(guān)鍵字
//1:字面量創(chuàng)建字符串對象
Stringstr1="abc";
//2:利用new關(guān)鍵字創(chuàng)建字符串對象
Stringstr2=newString("abc");
第二點(diǎn):字符串使用非常的頻繁,從空間和性能方面考慮,JVM實(shí)例化字符串時進(jìn)行了優(yōu)化:添加了字符串常量池。
第三點(diǎn):字符串常量池中的內(nèi)容是類加載完成以后創(chuàng)建的,而字符串常量池保存的是字符串對象的引用,具體實(shí)例對象存放在堆中。
第四點(diǎn):如果只是字面量進(jìn)行拼接,JVM會將它們優(yōu)化成一個字面量。
Stringstr="a"+"b";
//JVM會對上面的拼接進(jìn)行優(yōu)化,優(yōu)化后
Stringstr="ab";
第五點(diǎn):如果拼接中存在字符串變量,JVM會將它們優(yōu)化成StringBuilder進(jìn)行拼接,然后通過StringBuilder.toString()獲取。
Stringstr1="ab";
Stringstr2=str1+"c";
//上面字符串拼接存在字符串變量str1,JVM會對其優(yōu)化
Stringstr1="ab";
StringBuildersb=newStringBuilder();
sb.append(str1).append("c");
Stringstr2=sb.toString();
第六點(diǎn):new關(guān)鍵字會在堆上創(chuàng)建一個新的對象。
第七點(diǎn):intern()方法:返回常量池該字符串的引用
intern的作用:
1:如果字符串常量池中存在字符串對象的引用,則直接返回這個對象的引用
2:如果字符串常量池中不存在字符串對象的引用,則首先在堆中創(chuàng)建對象,然后將這個對象的引用存放在常量池中。
上面的這七點(diǎn)如果真正掌握了,我相信下面的面試就很容易了。
面試1:下面的一句代碼創(chuàng)建了幾個對象
Stringstr=newString("abc");
答案:創(chuàng)建了兩個對象。
解析:此題主要考察了第三點(diǎn)和第六點(diǎn)。
1)創(chuàng)建的第一個對象(第三點(diǎn)):在類加載時,首先判斷字符串常量中是否存在"abc"對象的引用,沒有則創(chuàng)建一個"abc"對象,然后把這個對象的引用存放在字符串常量池中。
2)創(chuàng)建的第二個對象(第六點(diǎn)):new關(guān)鍵字會在堆中創(chuàng)建一個新的對象。
面試2:下面的代碼會輸出什么
Stringstr1="abc";
Stringstr2="a"+"b"+"c";
Stringstr3=newString("abc");
System.out.println(str1==str2);
System.out.println(str1==str3);
答案:true,false
解析:此題主要考察了第三點(diǎn),第四點(diǎn)和第六點(diǎn)
1)true:str2在編譯期JVM會優(yōu)化成"abc",然后判斷字符串常量池中是否存在"abc"對象的引用,因?yàn)閟tr1已經(jīng)創(chuàng)建,所以str2從字符串常量池中獲取"abc"對象的引用。所以str1和str2都是指向同一地址的引用。
2)false:上面我們知道str1指向的時字符串常量池中"abc"的引用,而str3指向的時newString()創(chuàng)建的新對象的引用,所以str1和str3指向的不是同一個地址的引用。
面試3:下面的代碼會輸出什么
Stringstr1="abc";
Stringstr2="ab";
Stringstr3=str2+"c";
System.out.println(str1==str3);
答案:false
解析:此題主要考察第三點(diǎn)和第五點(diǎn)
1)str1指向的時字符串常量池中"abc"對象的引用。
2)str3在編譯時,JVM會將str3優(yōu)化成如下代碼。
StringBuildersb=newStringBuilder();
sb.append(str2).append("c");
Stringstr3=sb.toString();
從上面代碼中可以看出str3指向的時對象StringBuilder()對象的引用,所以str1和str3指向不同對象,所以false.
面試4:下面代碼會輸出什么
Stringstr1="abc";
Stringstr2="ab";
Stringstr3=(str2+"c").intern();
System.out.println(str1==str3);
答案:true
解析:考察第三點(diǎn)和第七點(diǎn)
1)如果字符串調(diào)用intern()方法,它會查看字符串常量池中是否存在"abc"的引用,存在直接返回它的引用。所以str1和str3指向同一個對象的地址。
面試5:為什么不要在循環(huán)中去拼接字符串
答案:因?yàn)樽址唇釉诰幾g時期JVM會將其優(yōu)化成StringBuilder對象進(jìn)行拼接,如果循環(huán)次數(shù)非常大的話,創(chuàng)建的StringBuilder對象非常的多,甚至可能會導(dǎo)致內(nèi)存溢出的情況。
以上就是動力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對“Java面試題:java字符串字面量”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時為你服務(wù)。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743