对一道基础string题及其变式题的思考与解析
1、下面程序的運(yùn)行結(jié)果是()(選擇一項(xiàng))
String str1=“hello”;
String str2=new String(“hello”);
System.out.println(str1==str2);
A.true
B.false
C.hello
D.he
答案:B
分析:str1沒有使用new關(guān)鍵字,在堆中沒有開辟空間,其值”hello”在常量池中,str2使用new關(guān)鍵字創(chuàng)建了一個(gè)對象,在堆中開辟了空間,”==”比較的是對象的引用,即內(nèi)存地址,所以str1與str2兩個(gè)對象的內(nèi)存地址是不相同的。
簡單變式:
下面程序的運(yùn)行結(jié)果是
String str1 = “hello”;
String str2 = “he” + new String(“l(fā)lo”);
System.err.println(str1 == str2);
A.true
B.false
C.exception
D.無輸出
正確答案:B
鏈接:https://www.nowcoder.com/questionTerminal/f06ee75317c44b44b43b10b1ffc866bd?pos=15&mutiTagIds=570_609_637_614&orderByHotValue=0
來源:牛客網(wǎng)
解析:
String str1= “hello”, String str2=“he”+“l(fā)lo”;之所以str1str2返回true是因?yàn)閮烧叨际窃谧址A砍刂?#xff08;由于初始化就會在此區(qū)域分布內(nèi)存)而常量池中的有個(gè)與棧區(qū)類似的特性,就是當(dāng)str2指向的常量在常量區(qū)已存在時(shí),他不會創(chuàng)建新的內(nèi)存空間來存此常量,而是指向已有常量的內(nèi)存(應(yīng)該是以此節(jié)約空間),此時(shí)str1與str2這兩個(gè)引用變量的值都是存"hello"的內(nèi)存空間地址,但是String str3= “he”+a;String a=“l(fā)lo”;時(shí)str1str3返回的為false,是因?yàn)?#xff1a;str1指向的hello在編譯期一如既往的還是分配在常量區(qū)內(nèi),a指向的llo也在常量區(qū),雖然str3也是初始化但是編譯器無法判斷a這貨到底是什么個(gè)情況,進(jìn)而不會將str3的等號右側(cè)聲明在常量區(qū)內(nèi),而是在通過構(gòu)造時(shí)在堆區(qū)中的非常量池外的內(nèi)存中聲明,至此str3與str1不止是分配內(nèi)存的時(shí)期不同(一個(gè)在編譯期,一個(gè)在運(yùn)行期)而且在內(nèi)存空間的區(qū)域也不同。另:“==”在java發(fā)中是判斷引用是否相等(內(nèi)存中的地址是否相等,并不是值相等),new String(“l(fā)lo”)之后肯定是在堆內(nèi)存中開辟內(nèi)存空間,所以地址改變,若是判斷 String str1=str2; System.out.println(“str1=str2:”+(str1=str2)); 答案:true。
后記:由于還是大二,最近沉迷于算法中有點(diǎn)不能自拔,學(xué)c和c++有點(diǎn)上癮,今天上了一天校企合作的Java培訓(xùn)課。以前學(xué)過的Java基礎(chǔ)都忘得差不多了。故打算寫幾篇博客來回憶復(fù)習(xí)忘掉的知識。后期還會繼續(xù)更新,懇請看到博文的各位幫忙指正。
總結(jié)
以上是生活随笔為你收集整理的对一道基础string题及其变式题的思考与解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode题库整理【Java】——
- 下一篇: LeetCode——1721.交换链表中