源码解析+代码演示:为什么使用StringBuffer和StringBuilder类型对字符串进行操作,内存地址不会变

源码解析:为什么使用StringBuffer和StringBuilder类型对字符串进行操作,内存地址不会变

1. 源码解析

2. 代码演示


源码解析

直接上源码(以append操作为例),咱们一行行来看 ![在这里插入图片描述](https://img-blog.****img.cn/20200702115305283.png) 这里先确定了输入的char[]数组的长度( int len = str.length;)

并根据长度使用ensureCapacityInternal()方法创建了一个新的扩容后的数组(如下),这就是对StringBuffer和StringBuilder类型自动扩容的实现
源码解析+代码演示:为什么使用StringBuffer和StringBuilder类型对字符串进行操作,内存地址不会变
接下来使用System.arraycopy()方法:
将原数组中的内容复制到通过ensureCapacityInternal()方法扩容后的新数组中,并将新数组的地址值改为原数组的地址。

这就是为什么地址值不变的原因!!!

System.arraycopy()方法的源码解释:
源码解析+代码演示:为什么使用StringBuffer和StringBuilder类型对字符串进行操作,内存地址不会变

代码演示

源码解析+代码演示:为什么使用StringBuffer和StringBuilder类型对字符串进行操作,内存地址不会变
运行结果
源码解析+代码演示:为什么使用StringBuffer和StringBuilder类型对字符串进行操作,内存地址不会变
可以看出确实是地址是发生了改变的,不过又通过System.arraycopy()方法将旧数组的地址赋给了新数组。