StringBuffer与StringBuilder之间的区别

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没有同步方法

 

对于下面的代码:

public class Test {
	public static void main(String[] args) {
		String result = "";
		if(Integer.valueOf(args[0]) == 0){
			result += "StringBuffer";
		}else{
			result += "StringBuilder";
		}
		result +=" Test";
		System.out.println(result);
	}
}

如果使用JDK1.6进行编译,结果为(编译后使用反编译工具查看.class文件):

public class Test{
	public Test(){}

	public static void main(String args[]){
		String result = "";
		if (Integer.valueOf(args[0]).intValue() == 0)
			result = (new StringBuilder(String.valueOf(result)))
				.append("StringBuffer").toString();
		else
			result = (new StringBuilder(String.valueOf(result)))
				.append("StringBuilder").toString();
		result = (new StringBuilder(String.valueOf(result)))
			.append(" Test").toString();
		System.out.println(result);
	}
}

当然,对于简单的字符串连接:

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";
	}
}

 

posted @ 2014-03-02 13:25  心意合一  阅读(177)  评论(0编辑  收藏  举报