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 code
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
其中newCapacity方法,代码如下:
private int newCapacity(int minCapacity) {
// overflow-conscious code
int 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) { // overflow
throw 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()方法。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
yaml 语言入门
编程免不了要写配置文件,YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。本文介绍 YAML 的语法,以JS-YAML的实现为例。你可以去在线 Demo验证下面的例子。 一、简介 YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。 它的基本语法规则如下。 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格。 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 #表示注释,从这个字符一直到行尾,都会被解析器忽略。 YAML 支持的数据结构有三种。 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary) 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list) 纯量(scalars):单个的、不可再分的值 以下分别介绍这三种数据结构。 二、对象 对象的一组键值对,使用冒号结构表示。 animal: pets 转为 JavaScript 如下。 { animal: 'pets' } Yaml 也允许另一种写...
-
下一篇
StringBuffer的解读(二)
StringBuffer的解读(二) StringBuffer默认容量大小是16个字符。 StringBuffer后面append NULL的测试,代码如下: public class Test { public static void main(String[] args) { StringBuffer sb = new StringBuffer("the"); System.out.println("sb is: " + sb);; String str = null; sb.append(str); System.out.println("sb is: " + sb);; } } StringBuffer后面append字符串+原先字符数组<容量的测试,代码如下: public class Test { public static void main(String[] args) { StringBuffer sb = new StringBuffer("the"); System.out.println("sb.length: " + sb.length()); Syst...
相关文章
文章评论
共有0条评论来说两句吧...