第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

請教字符串常量池

請教字符串常量池

紫衣仙女 2019-09-05 06:05:15
字符串常量池由于這些問題#1說明:問題1和問題2我的理解是“ 字符串常量 ”被拘留時(shí):String s = "abc";在以下情況下,JVM將創(chuàng)建一個(gè)新的String對象,而不是使用String Pool中的現(xiàn)有對象:String s = new String("abc");但是,在閱讀以下兩個(gè)類似的陳述后,我有一個(gè)疑問。來自SCJP準(zhǔn)備書:當(dāng)編譯器遇到String文本時(shí),它會檢查池以查看是否已存在相同的String。如果找到匹配項(xiàng),則對新文本的引用將定向到現(xiàn)有String,并且不會創(chuàng)建新的String文本對象。來自JavaRanch:在這種情況下,由于關(guān)鍵字“new”,我們實(shí)際上最終會遇到略微不同的行為。在這種情況下,對字符串文字的引用仍然放在常量表(String Literal Pool)中,但是,當(dāng)你來到關(guān)鍵字“new”時(shí),JVM必須在運(yùn)行時(shí)創(chuàng)建一個(gè)新的String對象,而不是使用常量表中的那個(gè)。因此,當(dāng)我們使用“new”并基于上面的定義創(chuàng)建對象時(shí),我們還在非池內(nèi)存和池內(nèi)存中放置引用。當(dāng)我們這樣做時(shí),JVM是否也應(yīng)該返回相同的引用?:String one = new String("test");String two = "test";System.out.println(one.equals(two)); // trueSystem.out.println(one == two);      // false因?yàn)樵诼暶髯址淖謺r(shí)String three = "test";它會存在于池中嗎?因此應(yīng)該返回相同的參考和打印真實(shí)?或者之前的陳述是否意味著它們將被放入池內(nèi)存中,但只是在使用new運(yùn)算符時(shí)跳過?
查看完整描述

3 回答

?
HUX布斯

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個(gè)贊

也許這有助于您理解:

String literal = "test";String one = new String(literal);String two = "test";System.out.println(literal == two); //trueSystem.out.println(one == two); //false

在您發(fā)布的示例中:

String one = new String("test");String two = "test";

由于實(shí)習(xí),傳遞給構(gòu)造函數(shù)的引用與引用String(String)具有相同的值two。但是,字符串本身(由這兩個(gè)引用引用)用于構(gòu)造分配給引用的對象one

在這個(gè)例子中,正好有兩個(gè)String用值“test”創(chuàng)建:一個(gè)在常量池中維護(hù)并"test"在表達(dá)式中使用文字時(shí)引用,第二個(gè)由“new”運(yùn)算符創(chuàng)建并分配給參考one

編輯

也許你對這句話感到困惑:

當(dāng)編譯器遇到String文本時(shí),它會檢查池以查看是否已存在相同的String。

請注意,這可能更明確地說明如下:

當(dāng)編譯器遇到String文本時(shí),它會檢查池中是否已存在相同的String 。

字符串只有在明確地實(shí)現(xiàn)或通過類使用文字時(shí)才放入池中。例如,如果你有這種情況:

String te = "te";String st = "st";String test = new String(te) + new String(st);

然后當(dāng)一個(gè)String將存在該值時(shí)test,表示字符串將不存在于池中,因?yàn)槲淖?code>"test"從未發(fā)生過。



查看完整回答
反對 回復(fù) 2019-09-07
?
牧羊人nacy

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊

 //Creates a new object even if one exists in the pool
    String s1 = new String("Tendulkar");

    // makes a new object string and then the reference is available to the pool
    String s2 = s1.intern();

    //this object is not created but references the address present in the pool
    String s3 = "Tendulkar";

    System.out.print(s1==s2); // results in false
    System.out.print(s2==s3); //very very true !!!




查看完整回答
反對 回復(fù) 2019-09-07
?
Qyouu

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊

你的問題 :


因此,當(dāng)我們使用“new”并基于上面的定義創(chuàng)建對象時(shí),我們還在非池內(nèi)存和池內(nèi)存中放置引用。當(dāng)我們這樣做時(shí),JVM是否也應(yīng)該返回相同的引用?:


Ans:使用new關(guān)鍵字創(chuàng)建新的字符串對象時(shí),生成的地址將是堆地址,而不是字符串常量池地址。兩個(gè)地址都不同。


問題:


String one = new String("test");

String two = "test";


System.out.println(one.equals(two)); // true

System.out.println(one == two);      // false

以前的語句是否意味著它們將被放入池內(nèi)存中,但在使用new運(yùn)算符時(shí)會被跳過?


答:是的,您的假設(shè)是正確的。當(dāng)程序員使用new關(guān)鍵字時(shí),JVM將忽略關(guān)于字符串常量池,并在Heap中創(chuàng)建一個(gè)新副本。因此兩個(gè)地址都不相同。



查看完整回答
反對 回復(fù) 2019-09-07
  • 3 回答
  • 0 關(guān)注
  • 282 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號