我想知道是否有人可以给我一个答案,这些语句中的哪一个在使用StringBuilder object的java中执行得更好:
使用
.append(string1 + string 2) vs
.append(string1).append(string2)发布于 2013-12-20 03:29:28
第二种选择几乎肯定会更好(假设有任何明显的性能差异)。当你写一些像这样的东西
string1 + string2它在内部转换为
new StringBuilder(string1).append(string2).toString()即创建一个新的StringBuilder来连接这些字符串。您的第二个变体绕过了这个问题,因为它直接附加到现有的StringBuilder中,避免了创建新的a。
发布于 2013-12-20 03:34:40
我们可以看看每个选项的字节码:
public class Concat {
private static String s1 = "foo";
private static String s2 = "bar";
public static String good() {
StringBuilder b = new StringBuilder();
b.append(s1).append(s2);
return b.toString();
}
public static String bad() {
StringBuilder b = new StringBuilder();
b.append(s1 + s2);
return b.toString();
}
}
$javap -c Concat.class
public static java.lang.String good();
Code:
0: new #2 // class java/lang/StringBuilder
3: dup
4: invokespecial #3 // Method java/lang/StringBuilder."<init>":()V
7: astore_0
8: aload_0
9: getstatic #4 // Field s1:Ljava/lang/String;
12: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: getstatic #6 // Field s2:Ljava/lang/String;
18: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: pop
22: aload_0
23: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
26: areturn
public static java.lang.String bad();
Code:
0: new #2 // class java/lang/StringBuilder
3: dup
4: invokespecial #3 // Method java/lang/StringBuilder."<init>":()V
7: astore_0
8: aload_0
9: new #2 // class java/lang/StringBuilder
12: dup
13: invokespecial #3 // Method java/lang/StringBuilder."<init>":()V
16: getstatic #4 // Field s1:Ljava/lang/String;
19: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
22: getstatic #6 // Field s2:Ljava/lang/String;
25: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
28: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
31: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
34: pop
35: aload_0
36: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
39: areturn您的第一个选择实际上是append(new StringBuilder().append(s1).append(s2).toString())。
发布于 2013-12-20 03:58:47
第一种方法打字更快,在很多情况下也更容易阅读。
第二个可能会稍微好一些(根据Jeffrey的字节码和arshajii的解释)。
然而,这种字符串连接不太可能成为系统中的瓶颈!如果性能有问题,您需要分析。编译器则有所不同。而改进算法通常比这种微观优化的影响要大得多。
不要在必要的时候提前优化!真的!这太诱人了,太浪费时间了。
https://stackoverflow.com/questions/20689999
复制相似问题