StringBuffer与StringBuilder之间的区别

时间:2023-03-09 03:18:31
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";
}
}