引子:工作之余,抽空心血来潮想看下StringBuffer、StringBuilder的源码,看看他是怎么附加字符串而不生成新的对象
字符内容用Char[] 数组存储
这两个对象有一个共同的父类AbstractStringBuilder
在进行append添加字符的时候是引用的父类方法
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
至于Buffer线程安全 ,Builder非线程的关键点就在于Buffer的方法用synchronized同步锁修饰而Builder没有
父类AbstractStringBuilder的append方法:
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;
}
ensureCapacityInternal方法只是用于扩容Char数组的长度 不做实际字符添加
实际添加字符的功能在 str.getChars ()方法里调用的System.arraycopy实现
String.getChars() 方法将字符从字符串复制到目标字符数组。
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
进而点进去想看arraycopy是什么样的,发现这个方法用native修饰
用native修饰的方法是调用的底层C语言写的函数。
本次源码阅读到此结束,下次有空再看看能不能找到这个方法的源码阅读学习一下
技 术 无 他, 唯 有 熟 尔。
知 其 然, 也 知 其 所 以 然。
踏 实 一 些, 不 要 着 急, 你 想 要 的 岁 月 都 会 给 你。