2013-04-02 69 views
0

使用new運算符創建的字符串是否駐留在堆上以及字符串池中?使用new構造的String對象在哪裏與堆不同?

或者可以有人指點我一些文件或鏈接,它會引導我字符串池的行爲?

+3

如果使用'new'創建它,它不在字符串池中。 –

+0

*「或者可以有人指向我指向我的字符串池行爲的某個文件或鏈接?」*您的意思是,像[JLS](http://docs.oracle.com/javase/specs/ jls/se7/html/index.html)和['String'](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html)文檔? –

回答

1

案例1

String s1="world"; 
String s2="india"; 
String s3="world"; 

這裏兩個對象將在池中創建。 s1和s3將指向同一個對象。 字符串文字轉到池內存。

案例2-

String s1=new String("world"); 
String s2=new String("india"); 
String s3=new String("world"); 

這裏三個對象將在堆上創建。

新單詞使用堆內存來創建對象。

希望我能分辨出來。

查看link瞭解更多詳情。

2

你的java代碼中的字符串常量駐留在一個字符串池中,但是使用new創建的不是。

字符串池是一種緩存,也存儲在堆中。

0

使用new運算符創建的字符串駐留在堆中,而不是存儲在字符串池中(字符串池也存在於堆內存中)。 但是,您可以使用String.intern()將該對象移入池中。
在字符串上調用String.intern()後,如果使用new關鍵字創建的字符串已存在於池中,則將返回池對象的引用。所以現在它會指向池中的對象而不是前一個。 更多details

0

其實沒有什麼承諾。

編譯器/ JVM可能決定在字符串池中創建它,但也可以在neap上創建它。 今天它可能會在JVM更新後的字符串池中爲您創建字符串,它可能會在堆上創建它們,以獲取完全相同的代碼。

關鍵是你的代碼不應該依賴上的字符串創建的事實。

例如 - 避免==運算符來比較字符串值。

+0

是你的答案基於一些文件或參考?如果是的話,那麼你能指點一下嗎? – Sam

相關問題