Java中的以下两个初始化之间有什么区别?
String a = new String();
String b = new String("");
答案 0 :(得分:19)
嗯,他们几乎相同。
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("")
将空字符串(""
)添加到字符串常量池(如果它尚不存在)。
除此之外,没有其他差异
注意:使用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
,如果字符串池中不存在""
对象。
初始化一个新创建的String对象,使其代表一个 空字符序列。
- 醇>
初始化一个新创建的String对象,使其代表 与参数相同的字符序列;换句话说,新的 created string是参数字符串的副本。
答案 4 :(得分:2)
TheLostMind大多是正确的,但我想补充一点,复制构造函数实际上并没有这么做:
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对象,因为实际上池中的一个共享""
实例肯定已经被其他类加载了