StringBuilder的append方法和String+String的区别

如题所述

javac会把 str += "b"; 变成一个StringBuilder的append 操作。
相当于一个 new StringBuilder().append("a").append("b").toString().

比自己调用append费事多了。
Java code

StringBuilder builder = new StringBuilder("a");
String s = builder.append("b").append("c").append("d").toString();

String a = "a";
a += "b";
a += "c";
a += "d";

javap -c 的输出:
Java code
Code:
0: new #2 // class java/lang/StringBuilder
3: dup
4: ldc #3 // String a
6: invokespecial #4 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
9: astore_1
10: aload_1
11: ldc #5 // String b
13: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16: ldc #7 // String c
18: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: ldc #8 // String d
23: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
26: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
29: astore_2
30: ldc #3 // String a
32: astore_3
33: new #2 // class java/lang/StringBuilder
36: dup
37: invokespecial #10 // Method java/lang/StringBuilder."<init>":()V
40: aload_3
41: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
44: ldc #5 // String b
46: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
49: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
52: astore_3
53: new #2 // class java/lang/StringBuilder
56: dup
57: invokespecial #10 // Method java/lang/StringBuilder."<init>":()V
60: aload_3
61: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
64: ldc #7 // String c
66: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
69: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
72: astore_3
73: new #2 // class java/lang/StringBuilder
76: dup
77: invokespecial #10 // Method java/lang/StringBuilder."<init>":()V
80: aload_3
81: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
84: ldc #8 // String d
86: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
89: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
92: astore_3
93: return
温馨提示:内容为网友见解,仅供参考
无其他回答

StringBuilder的append方法和String+String的区别
相比String每次+都重新创建一个String对象,重新开辟一段内存不同,StringBuilder和StringBuffer的append都是直接把String对象中的char[]的字符直接拷贝到StringBuilder和StringBuffer的char[]上,效率比String的+高得多。当然,当StringBuilder和StringBuffer的char[]长度不够时,也会重新开辟一段内存。另外,String...

StringBuilder的append方法和String+String的区别
StringBuilder类对字符串连接操作进行了优化,append的效率比直接String+String高。 但是Java编译器对String+String做了优化,String+String操作最终生成的代码就是使用StringBuilder进行字符串连接。

StringBuilder的append方法和String+String的区别
StringBuilder 是自己的字符串缓冲区,而String没有,String每次进行+运算都会申请新的字符串对象,只要你用了+,他的结果就是 new出来的新字符串。。。比如string a, 内存是 char[100], string b,的内存是char[50]那么 a+b的结果就是。new char[150]; 然后把char[100]和char[50]复制...

StringBuilder的append方法和String+String的区别
66: invokevirtual #6 \/\/ Method java\/lang\/StringBuilder.append:(Ljava\/lang\/String;)Ljava\/lang\/StringBuilder;69: invokevirtual #9 \/\/ Method java\/lang\/StringBuilder.toString:()Ljava\/lang\/String;72: astore_3 73: new #2 \/\/ class java\/lang\/StringBuilder 76: dup 77: invoke...

StringBuilder的append方法和String+String的区别
你要分解来看:str = str + "a";而str + "a" 会创建一个新的String对象,就慢了。你要知道String对象一旦创建就是不能被改变的,要达到字符串拼接的效果,就得不停创建新对象。StringBuilder直到最后sb.toString()才会创建String对象,之前都没有创建新对象(在你的例子中是的,但是如果你append的...

StringBuilder的append方法和String+String的区别
当我们通过“+”改变字符串时,原有的字符串实例默认还在内存中,所以内存应用效率不高。而StringBuilder可以避免此类问题,它最终只返回结果字符串实例。如果只是简单的低频率的去改变用“+”来操作就可以,如果频率较高,比较循环遍历里操作改变字符串,还是用StringBuilder的好!

StringBuilder的append方法和String+String的区别
两者性能上差别很大,如果用着字符串连接StringBuilder性能会好很多很多,特别是循环里面操作字符串,你自己可以做一个小示例 要想了解更多,可以追问

java拼接字符串,StringBuilder为什么比String快?
StringBuilder为什么比String快?因为String用+去拼接字符串,每次都要创建新的对象,即newString。而StringBuilder用append()方法拼接字符串,不需要创建新的对象。所以,为什么慢?因为创建对象慢。为什么创建对象慢?因为创建对象要分配内存等等操作。如果只是创建几个对象,还好,不影响,因为基本上没什么区别...

C#string和stringBuffer的区别
对了,区别就在于 String 的调用 concat 方法会新建立一个 String 对象,而 StringBuilder 的 append 方法返回的还是原来对象的应用。String 对象是不可改变的。每次使用 System.String 类中的方法之一或进行运算时(如赋值、拼接等)时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新...

c#中string和stringbuilder的区别
StringBuilder 类型是可变的, 可以通过调用 Append、Insert、Remove 或 Replace 方法来修改字符串。因此, 当需要进行大量字符串操作时,如果使用 string 类型,会产生大量的临时字符串,导致内存空间和性能问题。而使用 StringBuilder 可以避免这些问题.另外,string是值类型,而StringBuilder是引用类型。这就意味着...

相似回答