Java中新String()和新String(“”)的字符串初始化有什么区别?
Java中的以下两个初始化之间有什么区别?
String a = new String();
-
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. }
微小差异(相当微不足道):
-
new String();
执行时间比new String("");
因为复制构造函数做了很多东西。 -
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大部分是正确的,但我想补充一点,复制构造函数实际上并没有那么多:
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
,如果字符串池中不存在""
对象。
初始化新创建的String对象,使其表示空字符序列。
初始化一个新创建的String对象,使其表示与参数相同的字符序列; 换句话说,新创建的字符串是参数字符串的副本。
第一个是调用默认构造函数,第二个是调用复制构造函数,以便在每种情况下创建一个新字符串。
从纯粹实用的角度来看,这些结构之间没有任何区别,因为从来没有任何理由可以使用它们中的任何一种。 它们既浪费又过于复杂,因而同样毫无意义。
要使用空字符串初始化变量,请执行以下操作:
String s = "";
这样更短,更容易键入,并且避免创建任何 String对象,因为实际上,在实习池中的一个共享""
实例肯定已经被其他类加载了。