附加字符串

时间:2014-02-18 08:11:28

标签: java string mutable

任何人都可以解释以下字符串实现之间的区别 -

1)

{
    String comma=",";
    return finalStr = "Hello"+comma+"Welcome"+comma+"to"+comma+"Stack"+comma+"overflow";
}

2)

{
    return finalStr = "Hello,Welcome,to,Stack,overflow";
}

在第一个(1)块中将创建多少个字符串对象,是否只有一个字符串finalStr指向存储H ello,Welcome,to,Stack,overflow的内存位置,或者它将为每个创建多个位置单词然后一旦附加它将创建一个新的内存位置。

4 个答案:

答案 0 :(得分:3)

在这两种情况下,只会为每个对象创建一个String对象。因为,编译器足够聪明,可以理解编译时的串联。这些是字符串文字,它们将在编译时进行评估,并且只为每种情况创建一个字符串。

根据JLS

  

长字符串文字总是可以分成更短的部分   使用字符串写成(可能带括号的)表达式   连接运算符+ [...]此外,字符串文字总是如此   指的是String类的相同实例。

     
      
  • 由常量表达式计算的字符串(第15.28节)在编译时计算,然后视为文字。
  •   
  • 在运行时通过串联计算的字符串是新创建的,因此是不同的。
  •   

答案 1 :(得分:0)

查看thisthis回答。编译器会为您优化一些东西。所以坚持使用最易读的解决方案。

有几次问过类似的问题,如果你阅读了这些答案,你会发现一些关于你的问题的有用的进一步信息。

答案 2 :(得分:0)

据我所知, 在第一次演员JVM中不断制作即时变量以使字符串保持“Hello”,“Welcome”等...

此外,每个附加操作都需要另一个变量来保存附加的字符串,例如“Hello,”+“Welcome”......

另一方面,第二种情况,它为String分配一次。谢谢。

答案 3 :(得分:0)

使用javap检查编译器如何尝试优化代码,我首先使用StringBuilder进行连接,最后调用toString

   Code:
       0: ldc           #16                 // String ,
       2: astore_1      
       3: new           #18                 // class java/lang/StringBuilder
       6: dup           
       7: ldc           #20                 // String Hello
       9: invokespecial #22                 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
      12: aload_1       
      13: invokevirtual #25                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      16: ldc           #29                 // String Welcome
      18: invokevirtual #25                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      21: aload_1       
      22: invokevirtual #25                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      25: ldc           #31                 // String to
      27: invokevirtual #25                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      30: aload_1       
      31: invokevirtual #25                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      34: ldc           #33                 // String Stack
      36: invokevirtual #25                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      39: aload_1       
      40: invokevirtual #25                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      43: ldc           #35                 // String overflow
      45: invokevirtual #25                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      48: invokevirtual #37                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      51: astore_2     

情景2

52: ldc           #41                 // String Hello,Welcome,to,Stack,overflow
      54: astore_2      
      55: return