例如..
String herName = new String(" clark");
和
String hisName =" michal";
1)第一段代码完全正确,它将创建新的字符串 对象在堆内存中引用。
2)第二行代码,它是一个创建的字符串文字 字符串常量池中的字符串对象,而不是实际的堆内存。
Then what's the benefit, ?
答案 0 :(得分:0)
String herName = new String("clark");
在这种情况下,JVM将在普通(非池)堆内存中创建一个新的字符串对象,文字“clark”将放在字符串常量池中。变量herName将引用堆中的对象(非池)。
String hisName = "michal";
每次创建字符串文字时,JVM都会先检查字符串常量池。如果池中已存在该字符串,则返回对池化实例的引用。如果池中不存在string,则会创建一个新的字符串实例并将其放在
中答案 1 :(得分:0)
好处是new String(String s)
是Strings的复制构造函数,并按预期工作,提供给定String的副本。
调用new String("literally")
并不是为文字设计的一些特殊功能。事实上,相反的情况将是最不寻常的,如果new String(String s)
在使用文字时没有按预期工作会有什么好处呢?
最后,新对象完全在堆上的概念可能会产生误导,你确实有一个新对象,但因为String是不可变的,所以它安全地由相同的char[] value
支持,即使在Java 8源代码中也是如此引用只是传递:
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
答案 2 :(得分:-2)
第二种情况容易受到 interning 的影响 - 如果另一个字符串被初始化为同一个值,则会使用相同的对象。