源码解析+代码演示:为什么使用StringBuffer和StringBuilder类型对字符串进行操作,内存地址不会变
源码解析:为什么使用StringBuffer和StringBuilder类型对字符串进行操作,内存地址不会变
1. 源码解析
2. 代码演示
源码解析
直接上源码(以append操作为例),咱们一行行来看  这里先确定了输入的char[]数组的长度( int len = str.length;)并根据长度使用ensureCapacityInternal()方法创建了一个新的扩容后的数组(如下),这就是对StringBuffer和StringBuilder类型自动扩容的实现
接下来使用System.arraycopy()方法:
将原数组中的内容复制到通过ensureCapacityInternal()方法扩容后的新数组中,并将新数组的地址值改为原数组的地址。
这就是为什么地址值不变的原因!!!
System.arraycopy()方法的源码解释:
代码演示
运行结果
可以看出确实是地址是发生了改变的,不过又通过System.arraycopy()方法将旧数组的地址赋给了新数组。