2012-05-25 10 views
8
String h = "hi"; 

這裏我們引用字符串h來字符串文字嗨。 JVM有一個字符串文字池來存儲字符串文字,所以我們可以重複使用這些字符串,因爲它們是不可變的...在Java中的字符串的可重用性?

當我們說reusable,這是什麼意思?我們在談論address?它是從相同的地址evey時間挑選的?

+0

我認爲答案是肯定的。 –

回答

6

是,使事情變得更簡單,你可以把它作爲選擇相同的地址,但要更精確的變量保持不變參考 - JVM可用於映射到對象的正確內存地址(因爲對象可以在內存中移動)的標識符。

你可以通過這樣的代碼進行測試:

String w1 = "word"; 
String w2 = "word"; 
String b = new String("word"); // explicitly creating String by calling `new` operator 
           // won't put it in string pool 
System.out.println(w1 == w2); // true -> variables hold same reference 
System.out.println(w1 == b); // false -> variable hold different references 
b = b.intern(); // check if pool contains this string, if not put this string in pool, 
       // then return reference of such string from pool and store it in b variable 
System.out.println(w1 == b); // true -> now w1 and b hold same reference 
+0

b = b.intern(); //將字符串放入字符串池中,將其從池中返回,然後將其存儲在b refrence ....將其放入池中好了休息不明白:( – Nil

+0

我需要從'b.intern()'中存儲somewhare值,因爲字符串是不可變的(不能改變),所以我做'b = b.intern()'這就是爲什麼我寫了「存儲在b參考」 – Pshemo

+0

我只是讀一些東西..當你說字符串不能改變一次它是創建,這是什麼意思?[對不起4業餘問題] – Nil

8

String h = "hi"; 
String i = "hi"; 
String j = new String("hi"); 

的情況下根據不同的版本的JDK的編譯器可以做所謂interning並創建一個代表"hi"字節數據的單個實例和之間重用到變量引用。在最新的規範中,所有String literals都被固定在永久代中的字符串池中。

使用new關鍵字與上一條語句相同將創建一個新實例與完全相同的字節作爲單獨的對象。在運行創建

String對象是在字符串池中,除非.intern()叫他們。 This is usually not needed and can cause problems, rarely has any significant benefits.

h == i; // true 
h == j; // false 
j.intern(); 
h == j; // true 
+0

String h =「hi」;和字符串我=新字符串(「嗨」); ....在這種情況下發生了不同的事情? – Nil

+0

,使得h和i的內容「hi」存儲在一個地址處,並且對象j的內容「hi」存儲在另一個地址,我是否正確? – Nil

4

是什麼意思是,如果20級的對象使用相同的文本字符串:

private String h = "hi"; 

所有這些對象實際上將引用相同的字符串實例在內存中。這並不重要,因爲它不可能改變字符串的內容,因爲它是不可變的。因此可以在對象之間沒有問題地共享相同的實例。

3

JVM中有一個String文字池,其中所有String都是在程序生命週期內創建的。通過可重複使用,這意味着,如果要使用另一個String具有完全相同的字符和編碼,則不會創建新的String對象。相反,該參考將指向字符串池中已有的String。這被稱爲實習。

可以這樣做,因爲String在Java中是不可變的。

做這種事情的原因是爲了避免創建一個新對象的成本。

在這裏尋找什麼字符串常量池以及它是如何工作的更多細節:http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3

而且,看這個問題:Shouldn't I do `String s = new String("a new string");` in Java, even with automatic string interning?