在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中创建对象。不同的对象分配不同的内存空间。
下图就很直观的展示了这两种情况
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/