StringBuffer与StringBuilder之间的区别
2016-12-28 16:56
399 查看
[java] view
plain copy
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:
[java] view
plain copy
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence{
......
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
......
}
AbstractStringBuilder:
[java] view
plain copy
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:
[java] view
plain copy
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence{
......
public StringBuilder append(String str) {
super.append(str);
return this;
}
......
}
可以看到StringBuilder没有对方法进行同步,所以效率会高不少(StringBuilder没有同步方法)
对于下面的代码:
[java] view
plain copy
public class Test {
public static void main(String[] args) {
String str = "Just a";
System.out.println(str + " Test");
}
}
如果使用JDK1.6进行编译,结果为(编译后使用反编译工具反编译Test.class文件,如果担心反编译工具反编译结果不准确,可以直接通过javap命令查看Test类的编译结果):
[java] view
plain copy
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实现“+”符号连接字符串的功能
当然,对于简单的字符串连接:
[java] view
plain copy
public class Test {
public static void main(String[] args) {
String result = "String"+" "+"Test";
}
}
编译的结果为:
[java] view
plain copy
public class Test{
public Test(){}
public static void main(String args[]){
String result = "String Test";
}
}
plain copy
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:
[java] view
plain copy
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence{
......
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
......
}
AbstractStringBuilder:
[java] view
plain copy
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:
[java] view
plain copy
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence{
......
public StringBuilder append(String str) {
super.append(str);
return this;
}
......
}
可以看到StringBuilder没有对方法进行同步,所以效率会高不少(StringBuilder没有同步方法)
对于下面的代码:
[java] view
plain copy
public class Test {
public static void main(String[] args) {
String str = "Just a";
System.out.println(str + " Test");
}
}
如果使用JDK1.6进行编译,结果为(编译后使用反编译工具反编译Test.class文件,如果担心反编译工具反编译结果不准确,可以直接通过javap命令查看Test类的编译结果):
[java] view
plain copy
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实现“+”符号连接字符串的功能
当然,对于简单的字符串连接:
[java] view
plain copy
public class Test {
public static void main(String[] args) {
String result = "String"+" "+"Test";
}
}
编译的结果为:
[java] view
plain copy
public class Test{
public Test(){}
public static void main(String args[]){
String result = "String Test";
}
}
相关文章推荐
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer和StringBuilder之间的区别
- String、StringBuffer与StringBuilder之间区别
- Java--String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String,StringBuffer,StringBuilder之间的区别,以及使用中该注意什么(转)
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String, StringBuffer, StringBuilder 三者之间的区别是什么?
- String,StringBuffer,StringBuilder之间的区别和联系
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String、StringBuffer与StringBuilder之间区别
- String,StringBuffer,StringBuilder 之间区别
- String,StringBuffer,StringBuilder三者之间的区别
- String、StringBuffer与StringBuilder之间区别
- String 、StringBuffer、与StringBuilder之间的区别