- public class Test {
- public static void main(String[] args) {
- StringBuffer strBuffer = new StringBuffer();
- strBuffer.append("StringBuffer");
- strBuffer.append(" ");
- strBuffer.append("Test");
- System.out.println(strBuffer.toString());
-
- StringBuilder strBuilder = new StringBuilder();
- strBuilder.append("StringBuffer");
- strBuilder.append(" ");
- strBuilder.append("Test");
- System.out.println(strBuilder.toString());
- }
- }
使用StringBuffer和StringBuilder的输出结果都是相同的,只能从源代码下手了,StringBuffer:
- public final class StringBuffer
- extends AbstractStringBuilder
- implements java.io.Serializable, CharSequence{
- ......
- public synchronized StringBuffer append(String str) {
- super.append(str);
- return this;
- }
- ......
- }
AbstractStringBuilder:
- abstract class AbstractStringBuilder implements Appendable, CharSequence {
- ......
- public AbstractStringBuilder append(String str) {
- if (str == null) str = "null";
- int len = str.length();
- if (len == 0) return this;
- int newCount = count + len;
- if (newCount > value.length)
- expandCapacity(newCount);
- str.getChars(0, len, value, count);
- count = newCount;
- return this;
- }
- ......
- }
可以看到StringBuffer重写了父类方法,在父类方法的基础上增加了同步,所以会消耗一定的性能(StringBuffer的很多方法都是同步方法)
再来看看StringBuilder:
- public final class StringBuilder
- extends AbstractStringBuilder
- implements java.io.Serializable, CharSequence{
- ......
- public StringBuilder append(String str) {
- super.append(str);
- return this;
- }
- ......
- }
可以看到StringBuilder没有对方法进行同步,所以效率会高不少(StringBuilder没有同步方法)
对于下面的代码:
- public class Test {
- public static void main(String[] args) {
- String str = "Just a";
- System.out.println(str + " Test");
- }
- }
如果使用JDK1.6进行编译,结果为(编译后使用反编译工具反编译Test.class文件,如果担心反编译工具反编译结果不准确,可以直接通过javap命令查看Test类的编译结果):
- public class Test{
-
- public Test(){}
-
- public static void main(String args[]){
- String str = "Just a";
- System.out.println((new StringBuilder(
- String.valueOf(str))).append(" Test").toString());
- }
- }
Java底层通过StringBuilder实现“+”符号连接字符串的功能
当然,对于简单的字符串连接:
- public class Test {
- public static void main(String[] args) {
- String result = "String"+" "+"Test";
- }
- }
编译的结果为:
- public class Test{
- public Test(){}
-
- public static void main(String args[]){
- String result = "String Test";
- }
- }