任何人都可以解释以下字符串实现之间的区别 -
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
的内存位置,或者它将为每个创建多个位置单词然后一旦附加它将创建一个新的内存位置。
答案 0 :(得分:3)
在这两种情况下,只会为每个对象创建一个String对象。因为,编译器足够聪明,可以理解编译时的串联。这些是字符串文字,它们将在编译时进行评估,并且只为每种情况创建一个字符串。
根据JLS
长字符串文字总是可以分成更短的部分 使用字符串写成(可能带括号的)表达式 连接运算符+ [...]此外,字符串文字总是如此 指的是String类的相同实例。
- 由常量表达式计算的字符串(第15.28节)在编译时计算,然后视为文字。
- 在运行时通过串联计算的字符串是新创建的,因此是不同的。
答案 1 :(得分:0)
答案 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