首頁 >Java >java教程 >為什麼即使常數池中存在對相同文字的引用,Java 仍會建立一個新的字串物件?

為什麼即使常數池中存在對相同文字的引用,Java 仍會建立一個新的字串物件?

DDD
DDD原創
2024-11-03 07:26:02579瀏覽

Why Does Java Create a New String Object Even When a Reference to the Same Literal Exists in the Constant Pool?

Java 字串常數池:實習和引用相等

簡介:

虛擬常數池是Java 字串機(JVM),用於儲存常數值,包括字串文字。當 JVM 在編譯期間遇到字串文字時,它會檢查池中是否存在具有相同值的現有字串。如果找到,對新文字的參考將定向到現有字串,從而避免建立新實例。

使用「new」關鍵字進行實習:

但是,在建立新的String 物件時使用「new」關鍵字會引入不同的行為,如所提供的參考文獻所述。雖然對 String 文字(在本例中為「test」)的引用仍將放置在池中,但 JVM 有義務在運行時創建一個新的 String 對象,而不是重用池中的對象。

問題:

如果池中對字串文字的引用與使用「new」創建時相同,那麼JVM 不應該返回現有引用而不是創建一個新的?

答案:

不,當使用「new」運算子時,JVM 不會傳回現有引用。相反,它將建立一個新的 String 物件並將其指派給由「new」關鍵字建立的參考。這是因為:

  • 文字實習: 當編譯器遇到字串文字「test」時,它會檢查池中是否存在相同的字串。由於沒有,會建立一個值為「test」的新 String 物件並將其放入池中。
  • 使用「new」建構物件:當您建立一個新String 時使用「new String(literal)」物件時,對文字(「test」)的參考將傳遞給建構函數。這意味著構造函數中的引用與池中的文字具有相同的值。
  • 新物件建立:但是,「new」運算子指示 JVM 建立一個新的 String目的。這個新物件與儲存在池中的物件是不同的實例,即使它們引用相同的文字值。

範例:

<code class="java">String literal = "test";
String one = new String(literal);
String two = "test";

System.out.println(literal == two); // true (references in pool)
System.out.println(one == two); // false (distinct objects)</code>

在此範例中,「literal」和「two」引用指向池中的同一個 String 物件。然而,「one」引用指向「new」所建立的另一個 String 物件。因此,使用“==”進行相等比較將傳回 false。

澄清:

語句「當編譯器遇到字串文字時,它會檢查池以查看如果相同的字串已存在」應解釋為“在池中”,這意味著只有已保留或明確添加到池中的字串文字才會被考慮進行保留。

以上是為什麼即使常數池中存在對相同文字的引用,Java 仍會建立一個新的字串物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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