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