亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

什么是Java中的字符串池?

什么是Java中的字符串池?

呼啦一陣風 2019-07-01 10:13:34
什么是Java中的字符串池?我對Java中的StringPool感到困惑。在用Java閱讀字符串章節時,我看到了這一點。請幫助我理解,從外行的角度來看,StringPool到底做了些什么。
查看完整描述

3 回答

?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

這個指紋true(即使我們不使用equals方法:比較字符串的正確方法)

    String s = "a" + "bc";
    String t = "ab" + "c";
    System.out.println(s == t);

當編譯器優化字符串文本時,它會發現兩者都是st具有相同的值,因此只需要一個String對象。很安全,因為String在Java中是不可變的。
因此,兩者st指向同一個對象并節省一些內存。

名稱“字符串池”源于這樣一種想法,即所有已定義的字符串都存儲在某個“池”中,然后再創建新的字符串。String對象編譯器檢查是否已經定義了此類字符串。


查看完整回答
反對 回復 2019-07-01
?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

讓我們從虛擬機規范的引用開始:

加載包含字符串文本的類或接口可能會創建一個新的String對象(§2.4.8)來表示該文本。如果已經創建了一個字符串對象來表示該文本的前一次出現,或者在一個字符串對象上調用了String.intern方法,則可能不會發生這種情況。

這可能不會發生-這是個暗示,有什么特別的地方String物品。通常,調用構造函數將創建類的新實例。String的情況并非如此,特別是當String對象是用文字“創建”的時候。這些字符串存儲在全局存儲(池)中-或者至少將引用保存在池中,并且每當需要一個已知String的新實例時,VM從池中返回對象的引用。在偽代碼中,它可能是這樣的:

1: a := "one" 
   --> if(pool[hash("one")] == null)  // true
           pool[hash("one") --> "one"]
       return pool[hash("one")]2: b := "one" 
  --> if(pool[hash("one")] == null)   // false, "one" already in pool
        pool[hash("one") --> "one"]
      return pool[hash("one")]

所以在這種情況下,變量ab保存對對象。在這種情況下,我們(a == b) && (a.equals(b)) == true.

如果我們使用構造函數,則情況并非如此:

1: a := "one"2: b := new String("one")

再一次,"one"在池上創建,但隨后我們從同一個文本創建一個新實例,在本例中,它將導致(a == b) && (a.equals(b)) == false

所以為什么我們有字符串池嗎?字符串,特別是字符串文字,在典型的Java代碼中被廣泛使用。它們是不可改變的。并且是不可變的,允許緩存字符串以節省內存和提高性能(減少創建的工作量,減少要收集的垃圾)。

作為程序員,我們不必太在意字符串池,只要我們記住:

  • (a == b) && (a.equals(b))

    可能是

    true

    false (

    使用

    equals

    比較字符串)
  • 不要使用反射來更改背景

    char[]

    (因為您不知道是誰在使用該字符串)


查看完整回答
反對 回復 2019-07-01
  • 3 回答
  • 0 關注
  • 913 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號