您现在的位置是:首页 > 文章详情

StringBuffer的解读(一)

日期:2019-03-11点击:386

对于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; }

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

  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()方法。
原文链接:https://yq.aliyun.com/articles/693305
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章