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

3

4
我很确定这是一个重复的问题,但第一个会强制JVM给你一个新的实例,而第二个可能会给你一个已经存在的字符串对象。 - NullUserException
在什么情况下才是“更好”?几乎所有情况下,第二种形式都是“更好”。 - Dave Newton
好的,创建新实例的优缺点是什么?哪种更受欢迎? - nik7
2个回答

5

除非您有不寻常的、特定的需求和用例,否则始终使用第二个版本,而不是新版本。

针对@Ynwa的回应进行了编辑。

如果您需要一个您知道是唯一的字符串,并且将使用==进行比较(这也是不寻常的),那么请使用第一种情况。例如,如果您有一些字符串队列,并且您需要一个特定的字符串表示“全部完成”。现在,您可能可以使用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 
   }

如果客户端将"Terminator"放在队列中,它将会被处理。因此,你不应该阻止他们使用"Terminator"。但如果客户端将ThatQueueClass.TERMINATOR放入队列中,它将会被关闭。

有没有任何情况需要第一种情况? - nik7
@ynwa 是的,如果你特别需要一个新的String实例。 - Dave Newton
第二种方法对大多数情况来说更好,因为它隐式地实例化并初始化了一个值为“SomeValue”的字符串对象。String a = “SomeValue”;第一种方法很少使用,只用于创建现有字符串变量的独立副本。String b = new String(a);因为“String b = a”只是创建指向相同对象的引用副本,即“a”和“b”都将指向同一个对象! - Web User
@ynwa:如果你正在使用本地代码,那可能是这样。 - user541686

4

在Java中有一个概念叫做字符串常量池。为了减少在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

这是因为字符串对象是从字符串常量池中创建出来的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接