Programcreek -Java基础之String---用""还是用new String("")

Java里可以用两种方法来创建一个String:

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

这两种方法有什么不同?

1. 双引号 Vs. 构造函数

用两个简单的代码来回答这个问题。

Example 1:

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

在JVM 方法区,a和b指向同一个String字面量,内存引用是相同的,所以a==b。

当创建多个相同的String字面量时,只有一个相同的String字面量被保存下来。这称为字符串的驻留(string interning)。Java 中所有常量String都会自动被驻留。

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

JVM堆heap中c和d指向两个不同的对象,所以c==d值为假。不同的对象有不同的内存引用。

下图演示了这两种情景:

Programcreek -Java基础之String---用""还是用new String("")

2. 运行期字符串驻留String Interning

即使两个String是用构造函数(new String(""))构建,在运行期也会执行字符串驻留。

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. 如何使用

如果仅仅需要创建一个字符串,你需要使用双引号方式创建字符串。如果你需要在堆里新创建一个字符串对象时,可以考虑使用构造函数方式创建字符串。这里有个构造函数用例参考。

原文:http://www.programcreek.com/2014/03/create-java-string-by-double-quotes-vs-by-constructor/

字符串驻留参考:

http://blog.csdn.net/biaobiaoqi/article/details/6892352

http://java-performance.info/string-intern-in-java-6-7-8/

你可能感兴趣的:(java,String,Interning)