执行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我已经更新了这个问题,这个问题与您提到的问题并不重复 –