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对象,并将返回