執行String S1 = "hello";
後JVM將在SCP創建字符串對象,並該對象將持有字符數組中value
場像使用新字符串(「hello」)在簡單的「hello」中完全無用,當它間接指向「hello」時?
s1.value = {'h', 'e', 'l', 'l', 'o'}
當我們說
String s2 = new String("hello");
並根據源代碼String
類在構造函數執行後s2.value
也將變爲"hello".value
,它將類似於s1.value
。
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
所以每次我們創建一個使用new
JVM String對象將創建在堆
- 一個對象,並
- 一個字符串字面對象SCP的時間,如果它已經不存在
堆中的對象在內部指向SCP中的文字對象。
而每一次,我們作出s2
或以其他任何字符串的變化(不要緊它是從字面上或使用new
創建)字面一個新字符串將會在堆中,這是新更改s2
將創建點。使用String s2 = new String("hello")
不會創建"hello"
堆中的對象。 JVM正在SCP中創建"hello"
,除非它不存在,s2指向它。
我的問題是,new String("hello")
或簡單的"hello"
有什麼區別。當使用public String(String original)
剛剛創建堆空字符串對象,並浪費內存爲什麼Java允許開發人員調用public String(String original)
,爲什麼它甚至在String類提供什麼好處它給
我的問題是什麼?
新的字符串(「文本」)使字符的副本[] –
@simas_ch:不,它不。它曾經這樣做,但三年前就改變了。 – Holger
@Jens我已經更新了這個問題,這個問題與您提到的問題並不重複 –