在Java中字符串可以有两种方式构造:
String x = "abc";
String y = new String("abc");
那这两种方式之间有什么区别呢?
1.双引号和构造方法
这个问题可以用两个简单的例子来解答。
例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在方法区域中引用了相同的字符串文字,内存引用是相同的。当多次创建相同的字符串文字时,只存储每个不同字符串值的一个副本, 这被称为 “string interning“, Java中的所有编译时常量字符串都会自动执行。要理解String的intern参考:http://blog.csdn.net/soonfly/article/details/70147205
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指向堆中的两个不同的对象,不同的对象总是有不同的内存引用。
该图说明了上述两种情况
2.运行时字符串绑定
即使两个字符串是用构造函数构造的,仍然可以在运行时执行字符串实例
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类型了,使用构造函数将会创建一个额外的不必要的对象,因此,如果你只需要创建一个字符串,就应该使用双引号。
另外,如果确实需要在堆中创建一个新对象,则应该使用构造函数。