字串常數池:了解Interning 和「新」運算子
在Java 中,字串文字(例如「abc」)會被interned ,這意味著它們儲存在字串常數池中,並且對它們的引用是共享的。然而,當使用「new」運算子建立一個新的 String 物件時,會在記憶體中建立一個新對象,而不是引用池中的現有物件。
關於此行為的衝突陳述導致了誤解。雖然 JVM 在遇到文字時會檢查池中是否存在現有字串,但此檢查僅適用於實際保留的字串。如果在非池記憶體中引用文字(使用「new」),則會建立一個新對象,即使池中已存在匹配的字串。
為了說明這一點,請考慮以下程式碼:
<code class="java">String one = new String("test"); String two = "test";</code>
「test」是一個被保留的文字,因此對它的引用已經在池中。然而,當使用「new」建立一個新的 String 物件時,會在記憶體中分配一個新的 String 對象,這表示它具有與兩個不同的參考。
<code class="java">System.out.println(one.equals(two)); // true System.out.println(one == two); // false</code>
equals() 方法比較字串的值,這是相同的,但 == 運算子比較它們的引用,這是不同的。
暗示使用「new」建立的字串仍放置在池中的語句可能會引起混淆,但這是誤導性的。雖然與文字具有相同值的字串可能存在於記憶體中的某個位置,但它不會添加到池中,並且無法透過文字本身存取。
因此,當使用「new」運算子時,JVM會在記憶體中建立一個新的 String 對象,而不是傳回對池中現有物件的引用,即使存在具有相同值的物件。
以上是為什麼「new String()」會建立一個新對象,即使字串常數池中已經存在具有相同值的字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!