>>String/StringBuffer/StringBuilder的异同

(1)相同点
观察源码会发现,三个类都是被final修饰的,是不可被继承的。
(2)不同点
String的对象是不可变的;而StringBuilder和StringBuffer是可变的
查看源码可以发现,StringBuffer的实现都添加了Synchronized同步,因此StringBuffer是线程安全的,而StringBuilder不是线程安全的
String中的offset,value,count都是被final修饰的不可修改的;而StringBuffer和StringBuilder中的value,count都是继承自AbstractStringBuilder类的,没有被final修饰,说明他们在运行期间是可修改的,而且没有offset变量。

>>StringBuffer/StringBuilder源码学习

String底层是一个char数组:

private final char value[];

同样,StringBuffer/StringBuilder都继承了AbstractStringBuilder,
底层的实现也是通过一个char型数组:

char[] value;

它们的默认构造方法都是初始化一个长度为16的字符数组,

 public StringBuilder() {
        super(16);
    }

  public StringBuilder() {
        super(16);
    }

或者使用传入的容量进行初始化:

public StringBuilder(int capacity) {
        super(capacity);
    }

  public StringBuffer(int capacity) {
        super(capacity);
    }

再具体的实现就不去看了,有用到再研究。

>>使用举例

贴一个以前学习Java的例子,

String s1 = “hello”;
s1=“world”;
这个操作其实是:其实是创建了两个String对象。

String s2 = "hello"
s2 += "world";
这操作是:先创建一个String对象,在接下来进行字符串连接的时候,有创建了一个StringBuilder(jdk1.5前是StringBuffer),然后调用append()方法,最后调用toString()方法。
有此可以看出String对字符的操作比直接使用Stringbuffer(或者StringBuild)要多出附加的操作,而且String是不可变对象,使用String对字符串操作会产生大量的、多余java对象。所以结果是:影响性能,占用空间。
举例:
分别使用String和StringBuffer对字符串“0123456789”累加10000次,然后统计耗时多长:

     String str = "0123456789";
         String str2 = "";
        int count = 10000;
         long start = System.currentTimeMillis();
         for (int i = 0; i < count; i++) {
            str2 += str;
         }
         long end = System.currentTimeMillis();
         long time = (end - start);
         System.out.println(time);

  

运行多次,在我的机器上平均时间约等于3300,即3.3秒,下面用StringBuffer来操作,查看结果

String str = "0123456789";
StringBuffer sb = new StringBuffer();
int count = 10000;
long start = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
sb.append(str);
}
String str2 = sb.toString();
long end = System.currentTimeMillis();
long time = (end - start);
System.out.println(time);

  

同样在我的机器上结果平均结果小于10,即0.01秒,两者相差300多倍,而且随着循环次数的增加这个差距逐渐增大 。

Stringbuffer与Stringbuilder源码学习和对比的更多相关文章

  1. String,StringBuffer和StringBuilder源码解析[基于JDK6]

    最近指导几位新人,学习了一下String,StringBuffer和StringBuilder类,从反馈的结果来看,总体感觉学习的深度不够,没有读出东西.其实,JDK的源码是越读越有味的.下面总结一下 ...

  2. String、StringBuffer、StringBuilder源码解读

    序 好长时间没有认真写博客了,过去的一年挺忙的.负责过数据库.线上运维环境.写代码.Code review等等东西挺多. 学习了不少多方面的东西,不过还是需要回归实际.加强内功,方能扛鼎. 去年学习M ...

  3. String、StringBuffer、StringBuilder源码分析

    利用反编译具体看看"+"的过程 1 public class Test 2 { 3 public static void main(String[] args) 4 { 5 int ...

  4. StringBuffer 和Stringbuilder源码分析

    首先看一下他们的继承关系   这个两个对象都继承了AbstractStringBuilder抽象类.   1.他们的实现方式都一样的,唯一区别的StringBuffer在多线程的时候是保证了数据安全, ...

  5. String、StringBuffer和StringBuilder源码解析

    1.String 1.1类的定义 public final class String implements java.io.Serializable, Comparable<String> ...

  6. JDK源码学习系列03----StringBuffer+StringBuilder

                         JDK源码学习系列03----StringBuffer+StringBuilder 由于前面学习了StringBuffer和StringBuilder的父类A ...

  7. [源码]String StringBuffer StringBudlider(2)StringBuffer StringBuilder源码分析

      纵骑横飞 章仕烜   昨天比较忙 今天把StringBuffer StringBulider的源码分析 献上   在讲 StringBuffer StringBuilder 之前 ,我们先看一下 ...

  8. String,StringBuffer,StringBuilder源码分析

    1.类结构 String Diagrams StringBuffer Diagrams StringBuilder Diagrams 通过以上Diagrams可以看出,String,StringBuf ...

  9. JDK源码学习系列02----AbstractStringBuilder

     JDK源码学习系列02----AbstractStringBuilder 因为看StringBuffer 和 StringBuilder 的源码时发现两者都继承了AbstractStringBuil ...

随机推荐

  1. Spring学习7-Spring整合Hibernate

    一.Springl为什么要整合Hibernate   二者的整合主要是把hibernate中核心的一些类型交给spring管理,这些类型主要包括sessionFactory. transactionM ...

  2. JDBCTemplate基础学习

    JDBCTemplate:spring提供的用于操作数据库的模板,类似DbUtils.使用时必须设置数据源(DataSource):数据源如DBCP.C3P0等 一.JDBCAPI简单使用Demo 1 ...

  3. getshell工具

    目前支持64种CMS系统!全自动采集URL 全自动getshell 自动验证!!!

  4. phpcms 网站迁移服务器

    相信很多人不知道怎么去把PHPCMS V9进行搬家 在本地测试好的phpcms v9网站需要搬到服务器上,可以用以下方法: 1.上传所有的程序文件(如果主机支持压缩包在线解压,那么就打成zip的包,f ...

  5. Ubuntu 12.04 安装 Chrome浏览器

    1,先到chrome官网下载一个安装包 http://www.google.com/intl/zh-CN/chrome/ 2,ctrl+alt+t 打开终端. 3,在终端里输入sudo apt-get ...

  6. UVALive 6124 Hexagon Perplexagon 题解

    http://vjudge.net/problem/viewProblem.action?id=37480 East Central Regional Contest Problem C: Hexag ...

  7. 利用sourcemap来调试sass

    最近项目用上了sass,作为css的预处理器,它可以让我们用程序化的思维书写样式,极大的简化了css的开发,实在是前端居家旅行必备的利器. 我们都知道,在项目中,样式的频繁调试是不可避免的,用上sas ...

  8. thinkphp中模块和操作映射

    模板和操作映射功能是3.1.2版本支持的对模块和操作设置的映射机制,由于可以通过改变配置动态改变(实际真正改变,并非别名)URL访问地址,加强了应用的安全性,而且,映射机制具有URL不区分大小写访问的 ...

  9. dedecms如何自定义专题模板

    很多人看到别人的网站也是用dedecms建的,但是他们的专题做得很漂亮,也在想如何自定义dedecms专题模板呢? 其实很简单,只要在dedecms默认专题模板上做一些修改就好了 <!DOCTY ...

  10. URL编码表,URL编码大全

    url编码是一种浏览器用来打包表单输入的格式. 定义 url编码是一种浏览器用来打包表单输入的格式.浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送 ...