StringBuilder底层是一个普通数组,提供了一系列操作方法,可以在原有对象上进行改变
而String是私有的final数组,没有操作的方法,如果要改变只能新建String对象
StringBuilder用append添加元素,查看底层源码
此处要注意,StringBuilder调用的是父类的append方法,且最终返回this当前StringBuilder对象,所以,其地址不变,一直添加扩容。
查看其父类AbstractStringBuilder的append方法
进入ensureCapacityInternal方法,重新创建了一个新的数组并将原数组值copy过去,返回给value数组
扩容为原来数组长度的2倍+2,初始长度为16
总结
将原来数组value扩容为原来容量capacity()的2倍 + 2,还是同一个StringBuilder,内部数组在扩容时会新建容量更大的数组,将地址值返回给value数组,即每次扩容,其底层数组地址值都在改变,但最终返回的是StringBuilder对象,StringBuilder对象并没有改变,直接返回this。