Java String创建用双引号还是构造函数?
20
08 月

Java String创建用双引号还是构造函数?

在Java中,可使用两种方法创建一个字符串:

String x = "abc";
String y = new String("abc");

使用双引号和构造函数创建之间有什么区别呢?

1. 双引号与构造函数

这个问题可以通过使用两个简单的代码例子来回答。

String a = "abcd";
String b = "abcd";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True

a==b为真,因为在方法域中a和b都指同一字符串,指向存储区域的引用是相同的。

当创建相同的字符串超过一次,每个不同字符串值的副本被存储一次。这被称为“ 字符串驻留(string interning) ”。在Java编译时,字符串常量会自动驻留。

String c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d);  // False
System.out.println(c.equals(d)); // True

c==d是假的,因为c和d指向堆中两个不同的对象。不同的对象总是有不同的内存引用。

上述两种情况如下:

constructor-vs-double-quotes-Java-String-New-Page-650x324

2. 运行时的字符串驻留

感谢LukasEder(他的评论,原文中就有的):

在运行时字符串驻留依然可以进行,即便是使用构造方法:

String c = new String("abcd").intern();
String d = new String("abcd").intern();
System.out.println(c == d);  // Now true
System.out.println(c.equals(d)); // True

3. 何时恰当的使用

因为文字“ABCD”已经是String类型,如果使用构造方法会生成一个额外的对象。因此,如果你只需要创建一个字符串,使用双引号就行。

如果你需要在堆中创建一个新的对象,应该使用构造函数。这里是一个使用案例。