StringBuilder初始化容量以及扩容机制(源码分析)
发布日期:2021-04-30 21:02:08
浏览次数:106
分类:精选文章
本文共 1839 字,大约阅读时间需要 6 分钟。
StringBuilder的底层原理分析
当我们创建一个StringBuilder对象时,其内部实际上维护着一个char数组来存储字符数据。默认构造方法会初始化这个数组的大小为16,这是为了在拼接大量数据时提供一个足够大的初始容量,避免频繁的数组扩展操作。
1. 构造方法
- 无参构造:调用父类的构造方法,创建一个大小为16的char数组。
public StringBuilder() { super(16);} - 带参构造:接受一个整数参数,调用父类构造方法,创建相应大小的数组。
public StringBuilder(int capacity) { super(capacity);} - 字符串参数构造:计算字符串长度加16作为初始容量,然后调用append方法添加字符串。
public StringBuilder(String str) { super(str.length() + 16); append(str);}这种方式确保了初始容量足够大,减少了后续的append操作带来的数组扩展次数。
2. 扩容机制
- append方法:当需要添加大量字符时,首先检查当前容量是否足够,通过调用ensureCapacityInternal方法。
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方法:确保当前数组长度大于等于所需容量,如果不够,调用newCapacity方法扩展数组。
private void ensureCapacityInternal(int minimumCapacity) { if (minimumCapacity - value.length > 0) { value = Arrays.copyOf(value, newCapacity(minimumCapacity)); }} - newCapacity方法:计算新的容量大小,尽量避免内存溢出,先扩展到当前大小的两倍加2,如果仍不足则调用hugeCapacity。
private int newCapacity(int minCapacity) { int newCapacity = (value.length < 1) ? 2 : value.length * 2 + 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) { throw new OutOfMemoryError(); } return (minCapacity > MAX_ARRAY_SIZE) ? minCapacity : MAX_ARRAY_SIZE;}
3. 性能优化
通过这种扩容机制,StringBuilder避免了频繁的小数组扩展,提升了拼接操作的效率。每次append操作只会在需要时进行扩容,减少了内存分配和数组复制的开销,特别是在处理大量数据时,性能提升明显。
这种设计不仅提高了程序的运行效率,还增强了内存管理的稳健性,减少了因为内存不足导致的潜在问题。对于需要高性能和高稳定性的应用程序,StringBuilder的选择至关重要。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2026年05月29日 12时37分18秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
pkpmbs 建设工程质量监督系统 文件上传漏洞复现
2023-03-02