這涉及字串載入到字串常量池的原理:由於字串字面量先在編譯階段載入到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"的字串物件,如果有則不會再建立該物件,如果沒有,則會建立該物件。
-
如果字串常量池中不存在內容為 "hello" 的字串物件:在這種情況下,會建立兩個物件:
- 一個是在堆記憶體中透過
new String("hello")
建立的新的字串物件,這個物件在堆上分配記憶體。 - 另一個是常量池中的
"hello"
字串常量,會被建立並儲存在常量池中。
- 一個是在堆記憶體中透過
-
如果字串常量池中存在內容為 "hello" 的字串物件`:在這種情況下,只會建立一個物件:
- 僅會在堆記憶體中建立一個新的字串物件,而字串常量池中會重複使用已經存在的字串物件。