java中的隐式和显式字符串声明有什么区别?

时间:2015-11-26 05:30:48

标签: java string heap implicit explicit

例如..

  

String herName = new String(" clark");

     

     

String hisName =" michal";

     

1)第一段代码完全正确,它将创建新的字符串   对象在堆内存中引用。

     

2)第二行代码,它是一个创建的字符串文字   字符串常量池中的字符串对象,而不是实际的堆内存。

Then what's the benefit, ?

3 个答案:

答案 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 的影响 - 如果另一个字符串被初始化为同一个值,则会使用相同的对象。