字符串声明 - 两种不同的类型,哪个更好?

时间:2012-01-21 23:19:08

标签: java string declaration

  

可能重复:
  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";

有什么区别,哪一个更好,为什么?

感谢。

2 个答案:

答案 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文字池中创建的。