在java中可以使用2中方式创建一个字符串:

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

创建字符串使用”” 或者 构造函数有什么不同?

“” vs new String(“”);

这个问题可以使用2个例子来说明:

第一个例子:

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

a==b 是true 因为 a 和 b 在方法区中都指向了相同的字面量。内存索引是相同的。

当相同的字符串字面量创建多次的时候,只有一个被存储。这个情况叫做”string interning”。在Java中所有编译的字符串常量自动intern。

例子2:

1
2
3
4
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在堆中是两个不同的对象。不同的对象有不同的索引。

此图说明了上面的两种情况:

 java中创建字符串不同情况

2.Run-Time String Interning

String interning 也可以在运行时做到, 即使两个字符串是使用构造创建:

1
2
3
4
5
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类型,使用构造函数将创建一个额外的不必要的对象。因此,如果你只需要创建一个字符串尽量使用””。

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

参考文档