StringBuffer和StringBuilder扩容算法

2022-07-14 08:49:15

概述

StringBuufer和StringBuilder在创建的时候首先创建一个默认初识容量为16的char[]数组,然后 然后通过append添加内容,当总长度超出字符串容量的时候,会进行扩容,扩容规则为在当前的容量上*2+2,为新的容量

扩容机制为什么要+2?

因为我们创建StringBuffer的时候,可以通过参数手动设置初始容量,如果你输入的容量为0,这个时候在扩容机制里面的通过位运算符向右移动1位还是0,所以会出现问题,所以需要加2,防止这种情况出现

测试案例

    public static void test(){
        StringBuffer str = new StringBuffer();
        System.out.println(str.length());//长度为0
        System.out.println(str.capacity());//初识容量:16

        str.append("abcdeabcdeabcdeab");//添加1个长度为17的字符串
        System.out.println(str.length());//长度为17
        System.out.println(str.capacity());//容量:34

        str.append("abcdeabcdeabcdeabc");//添加18个字符串
        System.out.println(str.length());//长度为35
        System.out.println(str.capacity());//容量为70
    }

测试案例2

public static void m2(){
        StringBuffer str = new StringBuffer();
        String item = "";
        for (int i = 0; i < 36; i++) {
            item += "a";
        }
        //需要添加的字符串的长度36
        System.out.println(item.length());//36

        str.append(item);
        System.out.println("长度" + str.length());//36
        //源码分析得知扩容计算后,这个容量比需要的容量还少,那么让容量直接等于需要的容量
        System.out.println("容量" + str.capacity());//36

        //再次添加 验证是否需要扩容
        str.append("d");
        System.out.println("长度" + str.length());//37
        //进行扩容后,发现容量够用,所以原本容量36*2+2 = 现在的容量74
        System.out.println("容量" + str.capacity());//74
    }

源码分析

    
    private int newCapacity(int minCapacity) {
        // overflow-conscious code
        //新的容量=当前的长度通过位运算符向右移动1位并且+2
        int newCapacity = (value.length << 1) + 2;
        //如果新的容量比当前容量小
        if (newCapacity - minCapacity < 0) {
            //新的容量=当前容量
            newCapacity = minCapacity;
        }
        //返回  如果新容量小于0 或者 新容量大于最大值 那么抛出异常 否则返回新容量
        return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
            ? hugeCapacity(minCapacity)
            : newCapacity;
    }

StringBuffer和StringBuilder常用方法

append()添加
delete()删除
setCharAt()修改
charAt()查询
insert()插入
  • 作者:为人师表好少年
  • 原文链接:https://blog.csdn.net/weixin_44051038/article/details/106788431
    更新时间:2022-07-14 08:49:15