1、StringBuilder的作用
因为String字符串的不可变性,每一次拼接或者使用方法都会返回产生一个新的临时地址重新指向,StringBuilder解决了这一类的问题,可以直接在其本身操作,而不必新建对象。
2、StringBuilder的底层原理
(1)无参构造
由此可见StringBuilder类继承自AbstractStringBuilder类,实现了java.io.Serializable和CharSequence接口,其中StringBuilder的value值就是取自继承自AbstractStringBuilder类,相对于String是可变的。
也提供了无参构造,默认长度为16个长度。
这里无参默认传入的16,所以给value成员变量赋值了一个新的长度为16的char类型数组。
(2)有参构造
1、传入字符串
这里的value长度返回的是字符串长度加上16,然后再append加上字符串
2、传入int类型的数字
返回的长度就是你传入int类型数字的长度
3、append原理(底层代码逻辑)
假设你要添加一段字符串,则进入重写父类的append方法体中,首先调用父类的append方法。
首先父类的方法先判断你传入的字符串是否为空,如果为空则调用appendNull()方法
这个 appendNull()方法先是将原本StringBuilder的长度count赋值给了c,然后在对其进行扩容+4的操作,接下来对char数组进行重新赋值指向。对value数组进行添加null元素。
如果传入的不为空则将字符串的长度赋值给len,调用ensureCapacityInternal方法
在 ensureCapacityInternal方法中先传入count+len的参数minimumCapacity,紧接着判断这个长度减去当前的数组长度是否大于0,如果大于0则不进行扩容操作,如果不大于0说明要进行扩容操作。这里用Arrays.copyOf对value数组进行重新扩容,对value数组进行复制,复制的长度调用newCapacity方法。
这是首先对传进来的参数进行向左移1位(相当于扩大1倍)在加上2。紧接着进行判断操作,判断这个新数组长度是否比传入的最小长度还要小,如果小的话进行赋值最小长度操作。返回的值是如果新数组长度小于0或者新数组长度大于最大数组长度的话调用方法hugeCapacity,否则返回这个新数组长度。
这里如果新数组长度不在范围内的话会进行判断,如果当前长度比MAX_VALUE最大值还要大的话就对他进行异常抛出,如果当前长度未超过MAX_VALUE但比最大数组长度要大的话就返回当前数组长度,否则返回最大数组长度。
新数组长度拿到后在返回到刚才的Arrays.copyOf方法中创建一个新的数组并赋值给value,实现了不必操作自身也能实现字符串的各项操作。
4、StringBuilder相关常用方法
- insert(指定元素,元素) 将元素添加到指定的位置
- delete[start,end) 删除指定区间的字符
- charAt() 获取指定下标对应的字符
- deleteCharAt (删除指定下标对应的字符)
- sb.reverse() 字符串反转
- replace(start, end-1, 要替换的字符串) 替换字符串