StringBuffer的解读(一)
对于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;
}
代码差不多了,总结一下:
- append方法大部分实现是在AbstractStringBuilder中
- 如果append的是null,直接将null这4个字符加在后面
- 如果不是null,原本剩余容量能接纳新的String,调用String.getChars()方法将新的字符串加进去,里面各种边界检查之后,调用的是System.arraycopy()方法,这是一个native的方法,依赖于底层的实现。
- 原本容量不够,好的,容量double之后+2,还不够吗?好的,就用你给的参数值(就是原本字符数量+需要加进去的字符数量)。再通过Arrays.copyOf()方法,先复制原先的字符,最后回append方法中,走第3步中String.getChars()方法。
StringBuffer的解读(一)相关推荐
- spring-session源码解读 sesion
2019独角兽企业重金招聘Python工程师标准>>> spring-session源码解读 sesion 博客分类: java spring 摘要: session通用策略 Ses ...
- String StringBuffer StringBuilder的异同
1.String与StrIngBuffer StringBuilder的主要区别在于StrIng是不可变对象,每次对String对象进行修改之后,相对于重新创建一个对象. String源码解读: pr ...
- 翁恺老师 | 城堡游戏解读
这是我自己对城堡游戏的解读,解读后自己才不会囫囵吞枣地假装自己懂了. 城堡游戏是一个根据目前所处的房间与方向,来指明下一步所处位置与出口的小游戏. 翁恺老师讲课的精妙之处在于,从最简单也最缺乏设计感的 ...
- android 课程大纲,Android课程大纲解读.doc
Android课程大纲解读 Android课程大纲 Android-Java基础(25天)Java开发环境搭建基础知识 JAVA环境的搭建 Hello World 小程序JAVA语法基础基本语法掌握关 ...
- java Map toString() 源码解读测试
1. 编写一个单元测试类 @Testpublic void tt() {Map<Object, Object> map = new HashMap<>();map.put(&q ...
- StringBuffer类和StringBuilder类
1.StringBuffer 类基本介绍 java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删. 很多方法与String相同,但StringBuffer是可变长度的 ...
- String、StringBuffer、StringBuilder
String类 String 对象用于保存字符串,也就是一组字符序列,字符串常量对象是用双引号括起的字符序列,字符串的字符使用 Unicode 字符编码,一个字符(不区分字母还是汉字)占两个字节 pu ...
- Java String StringBuffer StringBuilder
(二)StringBuffer java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删.很多方法和String相同,但是StringBuffer是可变长度的 Stri ...
- Java - 常用类 - StringBuffer类
文章目录 StringBuffer类基本介绍 String VS StringBuffer StringBuffer的构造器 StringBuffer <=> String 相互转换 St ...
最新文章
- 博客基础_django_python从入门到实践_创建项目_创建应用
- gpg加密命令 linux_加密方案 GNUPG amp; Yubikey
- 转:初学者简易 .vimrc编写指南
- Python 模块初始化的时候,发生了什么?
- PHP中使用redis 执行lua脚本
- @RequestParam和@RequestBody区别
- c语言变量定义数组,C语言中数组的定义和使用
- u-boot移植随笔:EEPROM移植及测试
- linux判断网站被采集,网站被采集的几个处理方法(非技术)
- 中台“不火”了,企业数智转型如何破圈?
- 储存服务器装什么系统,存储服务器是什么操作系统
- 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第2节 TCP协议_3_TCP通信的客户端代码实现...
- 【路径规划】基于matlab遗传算法求解多物流中心开放式车辆路径规划【含Matlab源码 017期】
- 软件项目管理 project 实验
- unity开发罗技G29方向盘(制作操作汽车)
- 怎么打开计算机开机启动菜单,计算机怎么添加多系统启动菜单?
- 旷视科技计算机视觉算法研究员年薪,旷视科技算法研究员面经(21个问答)
- 曝光!中国女性的私密数据分析…
- JavaScript函子(随笔)
- springboot mybatis大学生校园宿舍管理系统源码含文档
热门文章
- python 获取照片拍摄时间_Python实现获取照片拍摄日期并重命名的方法
- C++函数指针使用示例
- mysql远程定时任务_Linux下定时任务实现mysql自动备份并上传远程ftp
- 64位浮点数_C语言常见面试题解析(1)——浮点数的比较
- python面试题及答案pdf_python面试题及答案
- 小米10鸿蒙版,小米10青春版高清渲染图公布:轻薄得不像5G手机
- 计算机系统应用的书,基于领域本体与上下文感知计算的智能图书-计算机系统应用.PDF...
- docker network host模式
- SQLAlchemy create table
- jinja Escaping