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的选择至关重要。

上一篇:给图片添加HDR色调
下一篇:springboot 打包可运行jar配置(记录)

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2026年05月29日 12时37分18秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章