StringBuffer与StringBuilder之间的区别

来源:互联网 发布:ipv6 直播软件 编辑:程序博客网 时间:2024/06/05 15:17
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         StringBuffer strBuffer = new StringBuffer();  
  4.         strBuffer.append("StringBuffer");  
  5.         strBuffer.append(" ");  
  6.         strBuffer.append("Test");  
  7.         System.out.println(strBuffer.toString());  
  8.           
  9.         StringBuilder strBuilder = new StringBuilder();  
  10.         strBuilder.append("StringBuffer");  
  11.         strBuilder.append(" ");  
  12.         strBuilder.append("Test");  
  13.         System.out.println(strBuilder.toString());  
  14.     }  
  15. }  

使用StringBuffer和StringBuilder的输出结果都是相同的,只能从源代码下手了,StringBuffer:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public final class StringBuffer  
  2.     extends AbstractStringBuilder  
  3.     implements java.io.Serializable, CharSequence{  
  4. ......  
  5.     public synchronized StringBuffer append(String str) {  
  6.         super.append(str);  
  7.         return this;  
  8.     }  
  9. ......  
  10. }  

AbstractStringBuilder:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. abstract class AbstractStringBuilder implements Appendable, CharSequence {  
  2. ......  
  3.     public AbstractStringBuilder append(String str) {  
  4.     if (str == null) str = "null";  
  5.         int len = str.length();  
  6.     if (len == 0return this;  
  7.     int newCount = count + len;  
  8.     if (newCount > value.length)  
  9.         expandCapacity(newCount);  
  10.     str.getChars(0, len, value, count);  
  11.     count = newCount;  
  12.     return this;  
  13.     }  
  14. ......  
  15. }  

可以看到StringBuffer重写了父类方法,在父类方法的基础上增加了同步,所以会消耗一定的性能StringBuffer的很多方法都是同步方法

再来看看StringBuilder:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public final class StringBuilder  
  2.     extends AbstractStringBuilder  
  3.     implements java.io.Serializable, CharSequence{  
  4.     ......  
  5.     public StringBuilder append(String str) {  
  6.     super.append(str);  
  7.         return this;  
  8.     }  
  9.     ......  
  10. }  

可以看到StringBuilder没有对方法进行同步,所以效率会高不少StringBuilder没有同步方法

 

对于下面的代码:

[java] view plain copy
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         String str = "Just a";  
  4.         System.out.println(str + " Test");  
  5.     }  
  6. }  

如果使用JDK1.6进行编译,结果为(编译后使用反编译工具反编译Test.class文件,如果担心反编译工具反编译结果不准确,可以直接通过javap命令查看Test类的编译结果):

[java] view plain copy
  1. public class Test{  
  2.   
  3.     public Test(){}  
  4.   
  5.     public static void main(String args[]){  
  6.         String str = "Just a";  
  7.         System.out.println((new StringBuilder(  
  8.                 String.valueOf(str))).append(" Test").toString());  
  9.     }  
  10. }  

Java底层通过StringBuilder实现“+”符号连接字符串的功能

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

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         String result = "String"+" "+"Test";  
  4.     }  
  5. }  

编译的结果为:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class Test{  
  2.     public Test(){}  
  3.   
  4.     public static void main(String args[]){  
  5.         String result = "String Test";  
  6.     }  
  7. }  

 

0 0
原创粉丝点击