欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

StringBuffer的扩容机制中为什么是*2+2?

时间:2023-07-01

StringBuffer的扩容机制中为什么是*2+2?

StringBuffer的扩容机制中为什么是*2+2?

在我们对StringBuffer的源码进行分析的时候。我们可以看到。

StringBuffer进行append时,方法是这样的,其中的synchronized正说明了其实线程安全的。

先判断添加的字符串是不是空,若为空就执行appendNull方法,不为空的话就计算添加的字符串长度,count是当前的stringBuffer对象的长度,然后进行扩容,最后将原有的内容复制到新的stringBuffer中,并且更新stringBuffer的长度。下面我们看一如何创建新的stringBuffer 的。

传递的参数是最小容量,就是原有长度+新增长度,判断一下是否超出范围,如果超出,就先new一个容量,在复制原有字符。

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

扩容的原理是左移一位(乘2)+2,左移我们可以理解,位运算比较快,那么+2是为何呢,原来是避免0左移1位还是0这样的问题,+2能够很好地避免这个问题。
此外如果*2+2还不够就把新的长度作为最小长度。
大家明白了吗。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。