StringBuilder的用法和是如何存储的

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相关常用方法

  1. insert(指定元素,元素)        将元素添加到指定的位置
  2. delete[start,end)                   删除指定区间的字符
  3. charAt()                                获取指定下标对应的字符
  4. deleteCharAt                        (删除指定下标对应的字符)
  5. sb.reverse()                          字符串反转
  6. replace(start, end-1, 要替换的字符串)          替换字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值