原文:Create Java String Using ” ” or Constructor?
在Java中,创建字符串有两种方式:
String x = "abc";
String y = new String("abc");
双引号与构造函数创建字符串,有什么区别?
双引号 vs 构造函数
这个问题可以用两个简单的例子来解答。
Example 1:
String a = "abcd";
String b = "abcd";
System.out.println(a == b); // True
System.out.println(a.equals(b)); // True
a==b
为true,是因为a和b都引用了方法区内的同一个字符串字面量。内存引用是相同的。
当相同的字符串字面量被创建多次时,只会储存一个字符串副本。这个被称为‘字符串驻留’。
Example 2:
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
为false,因为c和d指向堆中的不同对象。不同对象总是有不同的内存引用。
图说明了上述两种情况:
运行时字符串驻留
即使两个字符串是用构造函数构造的,字符串驻留仍然会在运行时完成:
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
注: intern()方法,为每个唯一的字符序列生成一个且仅生成一个String引用。
3.何时使用哪个?
因为字面量‘abcd’已经是String类型,因此使用构造函数会创建一个额外的不必要的对象。因此,如果你仅仅是需要创建一个字符串,双引号应该被使用。
如果你需要在堆中创建一个对象,构造函数应该被使用。这里有个用例