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

    技术2022-07-13  70

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

    1. 源码解析

    2. 代码演示


    源码解析

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

    并根据长度使用ensureCapacityInternal()方法创建了一个新的扩容后的数组(如下),这就是对StringBuffer和StringBuilder类型自动扩容的实现 接下来使用System.arraycopy()方法: 将原数组中的内容复制到通过ensureCapacityInternal()方法扩容后的新数组中,并将新数组的地址值改为原数组的地址。

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

    System.arraycopy()方法的源码解释:

    代码演示

    运行结果 可以看出确实是地址是发生了改变的,不过又通过System.arraycopy()方法将旧数组的地址赋给了新数组。

    Processed: 0.009, SQL: 9