簡體   English   中英

Java字符串文字池

[英]Java String Literal Pool

假設我們有以下代碼

String x = new String("xyz");
String y = "abc";
x = x + y;

我的一個朋友說總共創建了4個對象,而我說的只有3個。 有人可以解釋背景情況嗎? 我已經讀過有關字符串文字池的信息,但是我可以找到答案。

我對創建3個對象的解釋如下:一個在編譯時位於字符串文字池中(“ abc”),另一個在運行時位於堆上(“ abc”和x + y)

將創建4個對象。

字符串unmodifiable因此每次將它們串聯時,都會創建一個新對象

在的情況下, "xyz"new String("xyz"); 您首先創建“ xyz”對象,然后將其傳遞到新對象(字符串)中,所以這里有兩個對象

new String("xyz") <--there are two objects 
"abc"   <-- kinda obvious
x + y  <-- String are unmodifiable thus this is a new object

如下創建4個對象

// 1. "xyz" in the literal pool
// 2. a new String object which is a different object than "xyz" in the pool
String x = new String("xyz");

// 3. "abc" in the literal pool
String y = "abc";

// 4. new String object
x = x + y;

實際上..當兩個字符串的值相同時,字符串池才起作用。

例如,如果我們有String s1 =“ abc”和s2 =“ abc”,則s1和s2都將指向相同的內存引用(或對象)。

在上述情況下,將創建3個對象

  1. 用於x堆上的變量

  2. 對於堆棧上的y變量

  3. 用於堆上的x + y表達式

是的,代碼將創建4個對象

String x = new String("xyz"); // object#1 : xyz and Object #2: new String
String y = "abc";             // Object#3 : abc
x = x + y;                    // object#4 : xyzabc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM