【86期】五個刁鉆的String面試問題及解答
閱讀本文大概需要 5?分鐘。
來自:blog.csdn.net/u011541946/article/details/79865160
1.判定定義為String類型的st1和st2是否相等,為什么
package?string;
public?class?Demo2_String?{
???public?static?void?main(String[]?args)?{
?????String?st1?=?"abc";
?????String?st2?=?"abc";
?????System.out.println(st1?==?st2);
?????System.out.println(st1.equals(st2));?
???}
}
第一行:true
第二行:true
分析:
將此字符串與指定的對象比較。當且僅當該參數(shù)不為null,并且是與此對象表示相同字符序列的 String 對象時,結(jié)果才為 true。
運行先編譯,然后當前類Demo2_String.class文件加載進入內(nèi)存的方法區(qū)
第二步,main方法壓入棧內(nèi)存
常量池創(chuàng)建一個“abc”對象,產(chǎn)生一個內(nèi)存地址
然后把“abc”內(nèi)存地址賦值給main方法里的成員變量st1,這個時候st1根據(jù)內(nèi)存地址,指向了常量池中的“abc”。
前面一篇提到,常量池有這個特點,如果發(fā)現(xiàn)已經(jīng)存在,就不在創(chuàng)建重復的對象
運行到代碼 Stringst2 =”abc”, 由于常量池存在“abc”,所以不會再創(chuàng)建,直接把“abc”內(nèi)存地址賦值給了st2
最后st1和st2都指向了內(nèi)存中同一個地址,所以兩者是完全相同的。
2. 下面這句話在內(nèi)存中創(chuàng)建了幾個對象
String?st1?=?new?String(“abc”);
分析:

3.判定以下定義為String類型的st1和st2是否相等
package?string;
public?class?Demo2_String?{
???public?static?void?main(String[]?args)?{
?????String?st1?=?new?String("abc");
?????String?st2?=?"abc";
?????System.out.println(st1?==?st2);
?????System.out.println(st1.equals(st2));
???}
}

4. 判定以下定義為String類型的st1和st2是否相等
package?string;
public?class?Demo2_String?{
???public?static?void?main(String[]?args)?{
?????String?st1?=?"a"?+?"b"?+?"c";
?????String?st2?=?"abc";
?????System.out.println(st1?==?st2);
?????System.out.println(st1.equals(st2));
???}
}
5.判斷以下st2和st3是否相等
package?string;
public?class?Demo2_String?{
???public?static?void?main(String[]?args)?{
?????String?st1?=?"ab";
?????String?st2?=?"abc";
?????String?st3?=?st1?+?"c";
?????System.out.println(st2?==?st3);
?????System.out.println(st2.equals(st3));
???}
}
分析:


常量池創(chuàng)建“ab”對象,并賦值給st1,所以st1指向了“ab”
常量池創(chuàng)建“abc”對象,并賦值給st2,所以st2指向了“abc”
由于這里走的+的拼接方法,所以第三步是使用StringBuffer類的append方法,得到了“abc”,這個時候內(nèi)存0x0011表示的是一個StringBuffer對象,注意不是String對象。
調(diào)用了Object的toString方法把StringBuffer對象裝換成了String對象。
把String對象(0x0022)賦值給st3
總結(jié):
推薦閱讀:
【85期】談?wù)凧ava面向?qū)ο笤O(shè)計的六大原則,中高級面試常問!
【84期】面試中設(shè)計模式能問些什么?比如說一下三種單例模式實現(xiàn)
【83期】面試被問到了Redis和MongoDB的區(qū)別?看這里就對了
微信掃描二維碼,關(guān)注我的公眾號
朕已閱?

