String h = "hi";
這裏我們引用字符串h來字符串文字嗨。 JVM有一個字符串文字池來存儲字符串文字,所以我們可以重複使用這些字符串,因爲它們是不可變的...在Java中的字符串的可重用性?
當我們說reusable,
這是什麼意思?我們在談論address
?它是從相同的地址evey時間挑選的?
String h = "hi";
這裏我們引用字符串h來字符串文字嗨。 JVM有一個字符串文字池來存儲字符串文字,所以我們可以重複使用這些字符串,因爲它們是不可變的...在Java中的字符串的可重用性?
當我們說reusable,
這是什麼意思?我們在談論address
?它是從相同的地址evey時間挑選的?
是,使事情變得更簡單,你可以把它作爲選擇相同的地址,但要更精確的變量保持不變參考 - 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
在
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
是什麼意思是,如果20級的對象使用相同的文本字符串:
private String h = "hi";
所有這些對象實際上將引用相同的字符串實例在內存中。這並不重要,因爲它不可能改變字符串的內容,因爲它是不可變的。因此可以在對象之間沒有問題地共享相同的實例。
JVM中有一個String
文字池,其中所有String
都是在程序生命週期內創建的。通過可重複使用,這意味着,如果要使用另一個String
具有完全相同的字符和編碼,則不會創建新的String
對象。相反,該參考將指向字符串池中已有的String
。這被稱爲實習。
可以這樣做,因爲String
在Java中是不可變的。
做這種事情的原因是爲了避免創建一個新對象的成本。
在這裏尋找什麼字符串常量池以及它是如何工作的更多細節:http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3
我認爲答案是肯定的。 –