对于StringBuffer的解读

所有的源代码都是jdk1.8.0_202。

  • append(String str)方法的实现,代码如下:
@Override
public synchronized StringBuffer append(String str) {toStringCache = null;super.append(str);//直接调用父类的append方法。return this;
}

其中调用了其父类AbstractStringBuilderde的append(String str)这个方法,代码如下:

public AbstractStringBuilder append(String str) {if (str == null)return appendNull();int len = str.length();ensureCapacityInternal(count + len);str.getChars(0, len, value, count);count += len;return this;
}

其中appendNull方法,代码如下:

private AbstractStringBuilder appendNull() {int c = count;ensureCapacityInternal(c + 4);final char[] value = this.value;value[c++] = 'n';value[c++] = 'u';value[c++] = 'l';value[c++] = 'l';count = c;return this;
}

其中ensureCapacityInternal方法,代码如下:

private void ensureCapacityInternal(int minimumCapacity) {// overflow-conscious codeif (minimumCapacity - value.length > 0) {value = Arrays.copyOf(value,newCapacity(minimumCapacity));}
}

其中newCapacity方法,代码如下:

private int newCapacity(int minCapacity) {// overflow-conscious codeint newCapacity = (value.length << 1) + 2;if (newCapacity - minCapacity < 0) {newCapacity = minCapacity;}return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)? hugeCapacity(minCapacity): newCapacity;
}

我们再看看hugeCapacity是搞什么的,代码如下:

private int hugeCapacity(int minCapacity) {if (Integer.MAX_VALUE - minCapacity < 0) { // overflowthrow new OutOfMemoryError();}return (minCapacity > MAX_ARRAY_SIZE)? minCapacity : MAX_ARRAY_SIZE;
}

代码差不多了,总结一下:

  1. append方法大部分实现是在AbstractStringBuilder中
  2. 如果append的是null,直接将null这4个字符加在后面
  3. 如果不是null,原本剩余容量能接纳新的String,调用String.getChars()方法将新的字符串加进去,里面各种边界检查之后,调用的是System.arraycopy()方法,这是一个native的方法,依赖于底层的实现。
  4. 原本容量不够,好的,容量double之后+2,还不够吗?好的,就用你给的参数值(就是原本字符数量+需要加进去的字符数量)。再通过Arrays.copyOf()方法,先复制原先的字符,最后回append方法中,走第3步中String.getChars()方法。

StringBuffer的解读(一)相关推荐

  1. spring-session源码解读 sesion

    2019独角兽企业重金招聘Python工程师标准>>> spring-session源码解读 sesion 博客分类: java spring 摘要: session通用策略 Ses ...

  2. String StringBuffer StringBuilder的异同

    1.String与StrIngBuffer StringBuilder的主要区别在于StrIng是不可变对象,每次对String对象进行修改之后,相对于重新创建一个对象. String源码解读: pr ...

  3. 翁恺老师 | 城堡游戏解读

    这是我自己对城堡游戏的解读,解读后自己才不会囫囵吞枣地假装自己懂了. 城堡游戏是一个根据目前所处的房间与方向,来指明下一步所处位置与出口的小游戏. 翁恺老师讲课的精妙之处在于,从最简单也最缺乏设计感的 ...

  4. android 课程大纲,Android课程大纲解读.doc

    Android课程大纲解读 Android课程大纲 Android-Java基础(25天)Java开发环境搭建基础知识 JAVA环境的搭建 Hello World 小程序JAVA语法基础基本语法掌握关 ...

  5. java Map toString() 源码解读测试

    1. 编写一个单元测试类 @Testpublic void tt() {Map<Object, Object> map = new HashMap<>();map.put(&q ...

  6. StringBuffer类和StringBuilder类

    1.StringBuffer 类基本介绍 java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删. 很多方法与String相同,但StringBuffer是可变长度的 ...

  7. String、StringBuffer、StringBuilder

    String类 String 对象用于保存字符串,也就是一组字符序列,字符串常量对象是用双引号括起的字符序列,字符串的字符使用 Unicode 字符编码,一个字符(不区分字母还是汉字)占两个字节 pu ...

  8. Java String StringBuffer StringBuilder

    (二)StringBuffer java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删.很多方法和String相同,但是StringBuffer是可变长度的 Stri ...

  9. Java - 常用类 - StringBuffer类

    文章目录 StringBuffer类基本介绍 String VS StringBuffer StringBuffer的构造器 StringBuffer <=> String 相互转换 St ...

最新文章

  1. 博客基础_django_python从入门到实践_创建项目_创建应用
  2. gpg加密命令 linux_加密方案 GNUPG amp; Yubikey
  3. 转:初学者简易 .vimrc编写指南
  4. Python 模块初始化的时候,发生了什么?
  5. PHP中使用redis 执行lua脚本
  6. @RequestParam和@RequestBody区别
  7. c语言变量定义数组,C语言中数组的定义和使用
  8. u-boot移植随笔:EEPROM移植及测试
  9. linux判断网站被采集,网站被采集的几个处理方法(非技术)
  10. 中台“不火”了,企业数智转型如何破圈?
  11. 储存服务器装什么系统,存储服务器是什么操作系统
  12. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第2节 TCP协议_3_TCP通信的客户端代码实现...
  13. 【路径规划】基于matlab遗传算法求解多物流中心开放式车辆路径规划【含Matlab源码 017期】
  14. 软件项目管理 project 实验
  15. unity开发罗技G29方向盘(制作操作汽车)
  16. 怎么打开计算机开机启动菜单,计算机怎么添加多系统启动菜单?
  17. 旷视科技计算机视觉算法研究员年薪,旷视科技算法研究员面经(21个问答)
  18. 曝光!中国女性的私密数据分析…
  19. JavaScript函子(随笔)
  20. springboot mybatis大学生校园宿舍管理系统源码含文档

热门文章

  1. python 获取照片拍摄时间_Python实现获取照片拍摄日期并重命名的方法
  2. C++函数指针使用示例
  3. mysql远程定时任务_Linux下定时任务实现mysql自动备份并上传远程ftp
  4. 64位浮点数_C语言常见面试题解析(1)——浮点数的比较
  5. python面试题及答案pdf_python面试题及答案
  6. 小米10鸿蒙版,小米10青春版高清渲染图公布:轻薄得不像5G手机
  7. 计算机系统应用的书,基于领域本体与上下文感知计算的智能图书-计算机系统应用.PDF...
  8. docker network host模式
  9. SQLAlchemy create table
  10. jinja Escaping