1.StringBuilder是线程不安全的,里面的char[]是可变的,增删改操作都是依赖System.arraycopy 函数来实现的。StringBuilder会默认构造16个长度,当后面修改到超过时会自动扩容到(char[].length+ 1) * 2,这就是比String效率高的原因,不用像String一样容量不够就重新构造对象,StringBuilder会自动扩容。

2.自定义StringBuilder代码:

// 一些具体功能实现,两个实现类 StringBuilder和StringBuffer
abstract class AbstractStringBuilder {char value[];// 并不等于value.length 当前 有效字符串的长度int count;AbstractStringBuilder(int capacity) {value = new char[capacity];}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) // char[] 空间不够了expandCapacity(newCount);// 把 str 用 System.arraycopy 复制到value中str.getChars(0, len, value, count);count = newCount;return this;}void expandCapacity(int minimumCapacity) {// 扩大 (value.length + 1) * 2int newCapacity = (value.length + 1) * 2;if (newCapacity < 0) {newCapacity = Integer.MAX_VALUE;} else if (minimumCapacity > newCapacity) {newCapacity = minimumCapacity;}// 用System.arraycopy 来复制 value并 扩大newCapacity长度value = Arrays.copyOf(value, newCapacity);}public AbstractStringBuilder delete(int start, int end) {int len = end - start;// 要删除字符串的长度if (len > 0) {/*** 把要删除的字符串之后的的字符串 ,前移到删除的位置, 就表示 删除了字符串,*/System.arraycopy(value, start + len, value, start, count - end);count -= len; // 有效长度 减去删除的长度}return this;}public AbstractStringBuilder insert(int offset, String str) {int len = str.length();int newCount = count + len;if (newCount > value.length)// 容量不够 ,扩容expandCapacity(newCount);// 把 insert位置的len个长度 空出来System.arraycopy(value, offset, value, offset + len, count - offset);// 把str拷贝到 value中str.getChars(value, offset);count = newCount;return this;}
}
//StringBuilder类
class MyStringBuilder extends AbstractStringBuilder {public MyStringBuilder() {super(16);// 默认构造 16 个长度的char数组}// 添加字符串,父类实现public MyStringBuilder append(String str) {super.append(str);return this;}// 删除public MyStringBuilder delete(int start, int end) {super.delete(start, end);return this;}// 插入public MyStringBuilder insert(int offset, String str) {super.insert(offset, str);return this;}// 重新构造一个Stringpublic String toString() {// Create a copy, don't share the arrayreturn new String(value, 0, count);}
}

分析了几个重要方法,都是System.arraycopy来操作char[] 实现的。
老生常谈:深圳有爱好音乐的会打鼓(吉他,键盘,贝斯等)的程序员和其它职业可以一起交流加入我们乐队一起嗨。我的QQ:657455400

StringBuilder源码解析相关推荐

  1. String、StringBuffer、StringBuilder源码解析

    2019独角兽企业重金招聘Python工程师标准>>> String:如果短字符拼接的话效率是最高的,例如 String a="a"+"b"+ ...

  2. solrlucene3.6.0源码解析(三)

    solr索引操作(包括新增 更新 删除 提交 合并等)相关UML图如下 从上面的类图我们可以发现,其中体现了工厂方法模式及责任链模式的运用 UpdateRequestProcessor相当于责任链模式 ...

  3. EventBus源码解析

    前面一篇文章讲解了EventBus的使用,但是作为开发人员,不能只停留在仅仅会用的层面上,我们还需要弄清楚它的内部实现原理.所以本篇博文将分析EventBus的源码,看看究竟它是如何实现"发 ...

  4. JDK源码解析 Integer类使用了享元模式

    JDK源码解析 Integer类使用了享元模式. 我们先看下面的例子: public class Demo {public static void main(String[] args) {Integ ...

  5. yolov3之pytorch源码解析_springmvc源码架构解析之view

    说在前面 前期回顾 sharding-jdbc源码解析 更新完毕 spring源码解析 更新完毕 spring-mvc源码解析 更新完毕 spring-tx源码解析 更新完毕 spring-boot源 ...

  6. dubbo源码解析(一)

    大家好,我是烤鸭: 今天和大家分享dubbo的源码解析. 1.SPI http://dubbo.apache.org/zh-cn/docs/source_code_guide/dubbo-spi.ht ...

  7. string 长度_String源码解析

    本章源码分析基于JDK1.7 实现的接口 String类被final修饰词修饰,代表不可修改的特性,它实现了三个接口,Serializable是序列化接口,Compareble是排序接口,Char是字 ...

  8. JDK源码解析之java.util.AbstractCollection

    AbstractCollection类提供了collection的实现类应该具有的基本方法,具有一定的普适性,可以从大局上了解collection实现类的主要功能. java.util.Abstrac ...

  9. FastJson PropertyNamingStrategy 转换成JSON字符串的四种格式配置及源码解析

    FastJson在将bean转成JSON字符串时, 默认使用CamelCase(驼峰命名)的配置; 在1.2.15版本之后,FastJson支持配置PropertyNamingStrategy,有四种 ...

最新文章

  1. TMG学习(十),发布DMZ区网站
  2. 如何用数学和化学方法测量英国海岸线的长度
  3. 为什么借钱要上央行征信?
  4. 莫队算法 BOJ 2038 [2009国家集训队]小Z的袜子(hose)
  5. 【干货】玩转PyCharm
  6. 一个软件系统哪些可独立实现
  7. js 设计模式学习(1)
  8. python基础_collections系列
  9. ios获取区域服务器信息,ios获取服务器数据
  10. oracle表连接——处理连接过程中另外一张表没有相关数据不显示问题
  11. matlab计算涡度的函数_流函数涡量法的二维方腔流数值模拟matlab编程.doc
  12. Hexo的Next主题详细配置
  13. 虚拟机安装win10专业版
  14. java tolist_Java Collectors toList()用法及代码示例
  15. 怎样检测php语法错误,php语法检查的方法总结
  16. SCLK时钟信号可以高电平有效也可以低电平有效
  17. 构建全渠道零售平台及营销场景解读
  18. controller(控制器)
  19. HDU 1846 Brave Game 巴士博弈
  20. pandas分组聚合

热门文章

  1. python random randint_python中numpy.random.randint用法
  2. 第2章 C语言的关系与逻辑运算符 (九)
  3. 留守儿童工作计划安全工作总结范文
  4. UEFI开发探索95 – 弹跳小游戏
  5. 我毕业啦!再见东北林业大学!
  6. 原代细胞专刊 | 人脐静脉内皮细胞
  7. 周杰伦《说好不哭》刷屏背后的营销思考
  8. 一位台湾读者写的《I. M. Wright's Hard Code》第一章閱讀札記
  9. Gym_101981M Mediocre String Problem(exkmp+manachar)
  10. 如何使用kaldi训练得到录制音频的mfcc数据