可能重复:
Java String declaration
Java Strings: “String s = new String(”silly“);”
What is the purpose of the expression “new String(…)” in Java?
什么是
之间的区别String a = new String("SomeValue");
和
String a = "SomeValue";
有什么区别,哪一个更好,为什么?
感谢。
答案 0 :(得分:5)
除非您有不寻常的特定需求和用例,否则请始终使用第二版,而不是新版本。
编辑以回应@Ynwa
如果您特别需要一个您知道的String是唯一的,并且您将与==(这也是不寻常的)进行比较,那么请使用第一种情况。例如,你有一些字符串队列,你需要一个特定的字符串来表示“全部完成”。现在,可以想象,你可以使用null或一些奇怪的亚美尼亚字符串,但也许null对你的逻辑是合法的,如果你的软件最终在亚美尼亚使用怎么办?干净的方式是
public final static String TERMINATOR = new String("Terminator"); // actual text doesn't matter ...
// then, some loop taking from the Queue
while (keepGoing) {
String s = myQueue.take();
if (s == TERMINATOR)
keepGoing = false;
else
// normal processing of s
}
如果客户端将“终结者”放在队列中,它将被处理。所以你不要阻止他们使用“终结者”。但是如果客户端将ThatQueueClass.TERMINATOR放入队列,它将被关闭。
答案 1 :(得分:4)
在java中有一个String literal pool
的概念。为了减少在JVM中创建的String对象的数量,String类保留了一个字符串池。每次代码创建字符串文字时,JVM首先检查字符串文字池。如果池中已存在该字符串,则返回对池化实例的引用。如果池中不存在该字符串,则新的String对象将实例化,然后放入池中。
String str1 = "Hello";
String str2 = "Hello";
System.out.print(str1 == str2);
打印True
。
如果你这样做:
String str1 = "Hello";
String str2 = new String("Hello");
System.out.print(str1 == str2);
打印False
。
因为,String对象是从String文字池中创建的。