首頁  >  文章  >  Java  >  為什麼「new String()」會建立一個新對象,即使字串常數池中已經存在具有相同值的字串?

為什麼「new String()」會建立一個新對象,即使字串常數池中已經存在具有相同值的字串?

Patricia Arquette
Patricia Arquette原創
2024-11-03 05:58:30250瀏覽

Why does

字串常數池:了解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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn