Java中新String()和新String("")的字符串初始化有什么区别?

时间:2015-04-09 10:00:30

标签: java string initialization

Java中的以下两个初始化之间有什么区别?

  1. String a = new String();
  2. String b = new String("");

7 个答案:

答案 0 :(得分:19)

嗯,他们几乎相同

public static void main(String[] args) {
    String s1 = new String();
    String s2 = new String(""); 
    System.out.println(s1.equals(s2)); // returns true.
}

轻微差异(相当微不足道):

  1. new String();执行时间比new String("");少,因为复制构造函数会执行很多操作。

  2. new String("")将空字符串("")添加到字符串常量池(如果它尚不存在)。

  3. 除此之外,没有其他差异

    注意:使用new String("abc")几乎总是坏的,因为你将在String常量池上创建2个字符串,在堆上创建具有相同值的另一个字符串。

答案 1 :(得分:4)

Java Docs精美地解释

这是两个不同的构造函数调用

public String()
  

初始化一个新创建的String对象,使其代表一个   空字符序列。请注意,使用此构造函数是   因为字符串是不可变的,所以不必要。

public String(String original)
  

初始化一个新创建的String对象,使其代表   与参数相同的字符序列;换句话说,新的   created string是参数字符串的副本。除非明确   需要使用原始副本,不需要使用此构造函数   因为字符串是不可变的。

答案 2 :(得分:3)

在内部,将调用不同的构造函数。

但是,生成的String个对象的内容相同相等(a.equals(b)将返回true

答案 3 :(得分:2)

在第一种情况下,在第二种情况下只创建一个String对象:""new String,如果字符串池中不存在""对象。

  
      
  1. 初始化一个新创建的String对象,使其代表一个   空字符序列。

  2.   
  3. 初始化一个新创建的String对象,使其代表   与参数相同的字符序列;换句话说,新的   created string是参数字符串的副本。

  4.   

答案 4 :(得分:2)

TheLostMind大多是正确的,但我想补充一点,复制构造函数实际上并没有这么做:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/lang/String.java#137

137  public String() {
138 this.value = new char[0];
139 }

151 public String(String original) {
152 this.value = original.value;
153 this.hash = original.hash;
154 }

使用常量""将使用第一个构造函数来创建对象引用,因此使用哪一个并不重要。

在任何情况下,我都建议使用字符串文字"",因为如果在其他地方使用该字符串,则可以保存对象引用。如果您确实需要该字符串的副本,请仅使用String构造函数。

答案 5 :(得分:1)

第一个是调用默认构造函数,第二个是调用复制构造函数,以便在每种情况下创建一个新字符串。

答案 6 :(得分:1)

从纯粹实际的角度来看,这些结构之间存在差异,因为从来没有任何理由可以使用它们中的任何一个。它们既浪费又过于复杂,因而同样毫无意义。

要使用空字符串初始化变量,请执行:

String s = "";

这样更短,更容易键入,并且避免创建任何 String对象,因为实际上池中的一个共享""实例肯定已经被其他类加载了