簡介:
虛擬常數池是Java 字串機(JVM),用於儲存常數值,包括字串文字。當 JVM 在編譯期間遇到字串文字時,它會檢查池中是否存在具有相同值的現有字串。如果找到,對新文字的參考將定向到現有字串,從而避免建立新實例。
使用「new」關鍵字進行實習:
但是,在建立新的String 物件時使用「new」關鍵字會引入不同的行為,如所提供的參考文獻所述。雖然對 String 文字(在本例中為「test」)的引用仍將放置在池中,但 JVM 有義務在運行時創建一個新的 String 對象,而不是重用池中的對象。
問題:
如果池中對字串文字的引用與使用「new」創建時相同,那麼JVM 不應該返回現有引用而不是創建一個新的?
答案:
不,當使用「new」運算子時,JVM 不會傳回現有引用。相反,它將建立一個新的 String 物件並將其指派給由「new」關鍵字建立的參考。這是因為:
範例:
<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中文網其他相關文章!