String s = “hello“和String s = new String(“hello“)的區別

北冥有鱼要继续奋斗發表於2024-07-18

這涉及字串載入到字串常量池的原理:由於字串字面量先在編譯階段載入到class常量池中,然後在類載入階段從類常量池中載入到執行時常量池中,當字串字面量被呼叫的時候,會檢查字串常量池中是否包含該字串物件,如果已經包含,則直接返回該字串物件的引用,如果沒有,則建立該字串字面量對應的物件。

String s = "hello"

結合上面描述的字串常量池原理。String s = "hello"會建立0個或1個物件,首先字面量"hello"在編譯階段被載入到class檔案中的類常量池中,在類載入到虛擬機器的階段,“hello”會被載入到執行時常量池中,當這句程式碼被執行的時候,JVM會檢查字串常量池中是否存在內容為"hello"的字串物件,如果有則不會再建立該物件,如果沒有,則會建立該物件。

String s = new String("hello")

在語句 String s = new String("hello"); 中,實際上可能會建立一個或者兩個物件,具體取決於字串常量池中是否已經存在相同內容的字串。和上面分析一樣,首先字面量"hello"在編譯階段被載入到class檔案中的類常量池中,在類載入到虛擬機器的階段,“hello”會被載入到執行時常量池中,當這句程式碼被執行的時候,JVM會檢查字串常量池中是否存在內容為"hello"的字串物件,如果有則不會再建立該物件,如果沒有,則會建立該物件。

  1. 如果字串常量池中不存在內容為 "hello" 的字串物件:在這種情況下,會建立兩個物件:

    • 一個是在堆記憶體中透過 new String("hello") 建立的新的字串物件,這個物件在堆上分配記憶體。
    • 另一個是常量池中的 "hello" 字串常量,會被建立並儲存在常量池中。
  2. 如果字串常量池中存在內容為 "hello" 的字串物件`:在這種情況下,只會建立一個物件:

    • 僅會在堆記憶體中建立一個新的字串物件,而字串常量池中會重複使用已經存在的字串物件。

相關文章