StringBuilder与StringBuffer的底层原理实现

StringBuilder与StringBuffer的底层原理实现

(Stringbuilder与stringbuffer相同底层原理相同只是stringbuffer加了锁,下面以stringbuilder为例)
1.StringBuffer和StringBuilder都继承了AbstractStringBuilder
2.new StringBuilder()对象时:
(1) 如果传入参数为空,默认造一个长度为16的char型数组
(2)如果传入的参数为int型整数,造一个整数大小的char型数组
(3)如果传入的参数为string类型的字符串,造一个(字符串长度+16)大小的char型数组,然后调用append()方法
3.调用append(String str)方法时,会先调用父类AbstractStringBuilder的append()方法:
(1)首先判断str是否为null,如果str为null将null转化为字符串进行拼接操作(添加到value字符数组中),返回当前StringBuilder对象
(2)如果str不为null,调用ensureCapacityInternal()方法,传入当前数组中的(原本字符数组中被用的字符数【原字符串的长度】+将要添加的字符串的长度)—>minmunCapacity
(3)在ensureCapacityInternal()方法中先判断,minmunCapacity长度是否大于数组的容量,如果超过数组容量,就需要进行扩容:
①先设置新的容量为:原来容量 * 2 + 2;
​ ②如果新容量 - 所需的最小容量(minimumCapacity) 仍小于0,就设置新容量为所需的最小容量(minimumCapacity)
​ ③如果(newCapacity)新容量 < 0并且(minimumCapacity)所需的最小容量 < 0,抛出内存溢出异常
​ ④如果(newCapacity)新容量 < 0并且(minimumCapacity)所需的最小容量 不小于 0,设置新容量为整数的最大值
​ ⑤调用Arrays.copyOf()方法,创建一个容量为newCapacity的新数组,并将原数组中的值copy到新数组中,将新数组赋值给value并返回
(4)如果minmunCapacity小于数组的容量证明添加字符串后,当前数组仍可以存放的下,什么也不做,结束ensureCapacityInternal()方法
(5)接着调用了str.getChars()方法,他的内部就是调用了System.arraycopy()本地native方法,将字符串copy到拿到的新数组或者原始数组中
(6)将count = count(被用的字符数)+ 新添加的字符串的长度
4.调用toString(),实际上是new了一个值为stringbuilder值的String对象,并将返回

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值