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

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

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

嗯,它们几乎是一样的

 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("")将空String( "" )添加到String常量池(如果它尚不存在)。

除此之外,没有其他差异

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

Java Docs解释得很漂亮

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

 public String() 

初始化新创建的String对象,使其表示空字符序列。 请注意,由于字符串是不可变的,因此不必使用此构造函数。

 public String(String original) 

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

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

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

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

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

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

151 public String( String original){
这个 .value = original.value;
这个 .hash = original.hash;
154 }

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

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

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

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

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

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

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

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

 String s = ""; 

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