【翻译】创建String 使用“”还是构造函数(new String)

时间:2021-03-12 20:42:01

在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

a == b 返回True,是因为a和b 引用在jvm得方法区的同一个字符串(“abcd”),引用同一个内存空间。

当一个字符串被创建超过一次,每个不同的字符串只会存储一个。(相同的两个/多个字符串,只会存储其中一个)。

这称之为"string interning",所有的java 字符串在编译的时候都会自动 interning

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在jvm 栈中引用了不同的对象。new String(),会在Head中创建对象。不同的对象分配不同的内存空间。

下图就很直观的展示了这两种情况

【翻译】创建String 使用“”还是构造函数(new String)

2.Run-Time String Interning (不会翻译)

String interning 能够在运行时进行,甚至两个字符串通过构造函数创建。(原:String interning can still be done at run-time, even if two strings are constructed with constructors)

String c = new String("abcd").intern();
String d = new String("abcd").intern();
System.out.println(c == d);  // Now true (其实这里是1.7以上才会返回true,1.7一下是返回false的)
System.out.println(c.equals(d)); // True

3.什么时候用上面的方式去创建字符串

因为“abcd”已经是一个字符串,通过构造函数的方式(new String())去创建将会创建不必要的对象。

所以,如果你需要创建一个字符串,直接String a = "xxx",这样便可以。

如果你需要在栈上创建一个新的对象,那么你可以通过构造函数的方式去创建字符串:new String("xxx");

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