一、概述

StringBuilder是一个可变的字符串序列,这个类被设计去兼容StringBuffer类的API,但不保证线程安全性,是StringBuffer单线程情况下的一个替代实现。在可能的情况 ,建议,在代码中优先使用,因为它的实现更快。

二、常见方法

主要的方法是append和insert方法,有很多重载,以便接受任何类型的数据。一个是从尾部追加,一个是从任意位置插入。

一样的,StringBuilder在容量不够的情况下,会调用父类的扩容方法进行扩容,公式为:新容量取原容量的2倍加2和入参minCapacity中较大者。

类的定义如下:

public final class StringBuilderextends AbstractStringBuilderimplements java.io.Serializable, CharSequence

构造方法中一样的,默认容量为16,如果你构造的时候传入一个字符串,那容量就为字符串的长度+16。

append方法和insert方法都没有加同步关键字synchronized。

也有delete、replace、reverse、toString等方法。

三、序列化方法

    private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException {s.defaultWriteObject();s.writeInt(count);s.writeObject(value);}private void readObject(java.io.ObjectInputStream s)throws java.io.IOException, ClassNotFoundException {s.defaultReadObject();count = s.readInt();value = (char[]) s.readObject();}

四、Stringbuffer和StringBuilder的toString方法比较

StringBuffer的:

    public synchronized String toString() {if (toStringCache == null) {toStringCache = Arrays.copyOfRange(value, 0, count);}return new String(toStringCache, true);}

使用到了String的一个protected方法,在同一个包下,所以可以使用:

     /** Package private constructor which shares value array for speed.* this constructor is always expected to be called with share==true.* a separate constructor is needed because we already have a public* String(char[]) constructor that makes a copy of the given char[].*/String(char[] value, boolean share) {// assert share : "unshared not supported";this.value = value;}

从代码中我们可以看出,该方法和 String(char[] value)有两点区别,第一个,该方法多了一个参数: boolean share,其实这个参数在方法体中根本没被使用,也给了注释,目前不支持使用false,只使用true。那么可以断定,加入这个share的只是为了区分于String(char[] value)方法,不加这个参数就没办法定义这个函数,只有参数不能才能进行重载。那么,第二个区别就是具体的方法实现不同。我们前面提到过,String(char[] value)方法在创建String的时候会用到 会用到Arrays的copyOf方法将value中的内容逐一复制到String当中,而这个String(char[] value, boolean share)方法则是直接将value的引用赋值给String的value。

一般的做法如下:

this.value = Arrays.copyOf(value, value.length);

这样的好处就是性能好、共享内部数组节约内存。而且这个方法在外部也调用不到,不会破坏String的不可变特性。

StringBuilder的:

    public String toString() {//Create a copy, don't share the arrayreturn new String(value, 0, count);}

JDK源码系列(6)-StringBuilder相关推荐

  1. HashSet源码分析:JDK源码系列

    1.简介 继续分析源码,上一篇文章把HashMap的分析完毕.本文开始分析HashSet简单的介绍一下. HashSet是一个无重复元素集合,内部使用HashMap实现,所以HashMap的特征耶继承 ...

  2. JDK源码系列(2)-Object类

    引言 我们都知道,在Java中,Object是所有类的超类,所有的类其实都是隐含继承自Object类的,所以extends Object默认是不用写的,当然你写了也不会错.所有的类都可以使用Objec ...

  3. 大白话讲解JDK源码系列:从头到尾再讲一遍ThreadLocal

    引言 其实网上有很多关于ThreadLocal的文章了,有不少文章也已经写的非常好了.但是很多同学反应还有一些部分没有讲解的十分清楚,还是有一定的疑惑没有想的十分清楚.因此本文主要结合常见的一些疑问. ...

  4. JDK源码系列:Future是如何实现的?

    大家好,我们在异步编程时向线程池提交(submit)一个任务后会得到一个 Future对象,通过 future.get() 方法可以堵塞等待结果的完成,例如: public static void m ...

  5. JDK源码系列:子线程如何继承父线程上通过ThreadLocal绑定的数据

    上一篇中老吕介绍了ThreadLocal线程数据绑定的原理,今天聊聊父子线程之间如何继承ThreadLocal上维护的数据. 开发过程中异步执行任务有两种情况,第一种情况是 主线程 通过 new Th ...

  6. JDK源码系列(3)-String

    在JDK中,String的使用频率和被研究的程度都非常高,所以接下来我只说一些比较重要的内容. 一.String类的概述 String类的声明如下: public final class String ...

  7. JDK源码系列:ThreadLocal弱引用真的是过度设计吗?

    在<码处高效:Java开发手册>这本书上详细描述了ThreadLocal的原理,也有过度设计的说法, 难道弱引用设计真的没必要吗?对此老吕要仔细分析分析,ThreadLocal到底该不该使 ...

  8. JDK源码系列:synchronized与wait、notify、notifyAll

    大家好,今天聊一聊synchronized与obj.wait().obj.notify().obj.notifyAll() 之间的关系以及它们的实现原理. 我们今天采用边写demo边分析的方式来进行. ...

  9. JDK源码系列(5)-StringBuffer

    一.概述 StringBuffer是一个线程安全的.可变的字符序列,跟String类似,但它能被修改.StringBuffer在多线程环境下可以很安全地被使用,因为它的方法都是通过synchroniz ...

最新文章

  1. 使用正则表达式匹配HTML 下各种title标签
  2. nginx配置解决vue单页面打包文件大,首次加载慢的问题
  3. reactjs脚手架配置http-proxy-middleware代理解决跨域问题
  4. 【嵌入式系统】STM32串口通信的四种方法(基于RTOS)
  5. python中split函数_python strip()函数和Split函数的用法总结
  6. 快排序和堆排序,最小堆、最大堆
  7. 计算机二级vfp表格应用,计算机二级VFP辅导:VFP表的关联
  8. 复旦sakai安装指南
  9. 增量式PID计算公式完整详细推导过程
  10. java maven项目导入本地jar包
  11. word文件文档文本恢复转换器
  12. 1028 大数乘法 V2(NTT or FTT)
  13. 腾讯X5浏览器简单使用
  14. 【机器视觉】工业传统视觉和3D视觉算法
  15. 第一个python自动化脚本
  16. moodle 课程设置
  17. 计算机毕业设计之java+springboot基于vue的生鲜交易系统-生鲜商城网站
  18. python选择题题目_《Python程序设计》题库 - 选择题
  19. 一文了解 Web3 将如何改变投资领域
  20. 未来IT革命5.0之路,何去何从?

热门文章

  1. Hyperreal number
  2. 设计模式之Observer(观察者)模式
  3. python运维开发笔记5
  4. 一个关于将满足给定条件的数据按顺序写到另一文件中的C语言函数。
  5. 算法题存档20200627(树)
  6. ios 旋转加载gif_iOS 中gif图的显示
  7. PHP7垃圾回收机制详解(附GC处理完整流程图)
  8. golang 返回值问题
  9. CSS中box-sizing: border-box;的作用
  10. Javaweb乱码解决