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

StringBuffer与StringBuilder之间的区别的更多相关文章

  1. String、StringBuffer、StringBuilder之间的区别

    String                      字符串常量 StringBuffer         字符串变量(线程安全) StringBuilder       字符串变量(非线程安全) ...

  2. String、Stringbuffer和Stringbuilder之间的区别

    关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 1.在执行速度方面:Stringbuilder>Stringbuffer&g ...

  3. Java中String、StringBuffer和StringBuilder之间的区别

    String在Java中是字符串常量 例如 String str = "abc"; str = str + 1; System.out.println(str); 结果将是abc1 ...

  4. String、StringBuffer与StringBuilder之间区别[全屏看文]

    String.StringBuffer与StringBuilder之间区别[全屏看文]   最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,S ...

  5. String、StringBuffer与StringBuilder之间区别(转)

    原文链接:String.StringBuffer与StringBuilder之间区别 最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,Stri ...

  6. 自己(转)String、StringBuffer与StringBuilder之间区别

    String.StringBuffer与StringBuilder之间区别   最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringB ...

  7. StringBuffer与StringBuilder有什么区别

    package String比较; /* * StringBuffer与StringBuilder有什么区别 * StringBuilder是JDK5增加的一个新类,功能几乎与StringBuffer ...

  8. 【转载】String、StringBuffer与StringBuilder之间区别

    文章来源:http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html 这两天在看Java编程的书,看到String的时候将之前没有弄懂的 ...

  9. String、StringBuffer、StringBuilder之间区别

    String,StringBuffer,StringBuilder 之间区别 在字符串处理中C#提供了String.StringBuffer.StringBuilder三个类.那么他们到底有什么优缺点 ...

随机推荐

  1. @Resource和@Autowired

    @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...

  2. combobox的下拉框高度怎样设计合理

    orry,代码如下$.extend($.fn.combobox.methods, {        autoHeight : function (jq) {//combobox扩展,自动调整高度    ...

  3. 从零开始学习jQuery (十) jQueryUI常用功能实战

    一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些许秘籍. 本文是实战篇. 使用jQueryUI完成制作网站 ...

  4. Alexander Grothendieck去世了

    Alexander Grothendieck (German: [ˈɡroːtn̩diːk]; French: [ɡʁɔtɛndik]; 28 March 1928 – 13 November 201 ...

  5. NESPER的大体结构 z

    NEsper从内容上分为两块,NEsper的核心NEsper.dll和NEsper.IO.dll. (1)NEsper的核心包包含了EPL语法解析引擎,事件监听机制,事件处理等核心模块. (2)NEs ...

  6. Oracle将英文字符集数据转换成中文

    转换背景:老系统数据为英文字符集,需要将老数据(Oracle 8i)转换到oracle 10g(中文字符集)中 思路:先将老数据从8i的数据库中导出,导出的数据库文件为英文字符集,再将10g的数据库改 ...

  7. 【转】centos 6.4 samba 安装配置

    关掉防火墙     service iptables stop  chkconfig iptables off (永久关闭防火墙) 关闭SELinux vi /etc/sysconfig/selinu ...

  8. 最近用unity5弄的一些渲染

    unity5 人皮渲染  Skin Shading 换了一种方法,优化了一下代码,unity5效果很好,消耗不大 点开可查看大图 加入了次表面散射的阴影与自阴影 unity5  ocean real- ...

  9. C# 隐藏和覆盖

    1.在C#里面,只有声明vitual.abstract和带override的方法能够被子类重写(override). 2.如果父类方法没有以上关键字,子类又有和父类一样的方法,那么,就默认隐藏父类方法 ...

  10. Java笔记(十四)……抽象类与接口

    抽象类概念 抽象定义: 抽象就是从多个事物中将共性的,本质的内容抽取出来. 例如:狼和狗共性都是犬科,犬科就是抽象出来的概念. 抽象类: Java中可以定义没有方法体的方法,该方法的具体实现由子类完成 ...