简单概括

先上源码:

  1. /**
  2. * Arrays类的copyOf方法,本质上还是调用了底层C语言来实现的arraycopy方法
  3. */
  4. public static char[] copyOf(char[] original, int newLength) {
  5. char[] copy = new char[newLength];
  6. System.arraycopy(original, 0, copy, 0,
  7. Math.min(original.length, newLength));
  8. return copy;
  9. }

System.arraycopy的实现流程图大致如下
image.png
因为Java是调用底层C语言的方式实现的,我目前对C语言语法还不是很熟悉
因此暂时略过,以其他人的文章为主

深克隆还是浅克隆

直接上结论:

  • Arrays.copyof方法是浅克隆,只复制了对象的引用(内存地址),并没有为每个元素创建新的对象

解析:

  • 当克隆的是一个数组时,会创建一个新的数组
  • 当数组中存储的是:基础类型 / String类数据时
    • 需要修改其中的值时,如 a[1] = 1 或者a[1] = “string”
    • 此时是赋值操作,会创建一个新的int / String对象,并返回它的引用
    • 其结果是新数组的某个位置改变了对象的引用,不会对旧数组产生任何影响
  • 当数组中存储的是:一个类的实例对象时

    • 需要修改其中的值时,如 a[1].setDogName = “Yahho”
    • 此时修改的是内部类中,某个实例域的对象引用
    • 其结果是新旧两个数组中的这个对象的实例域值,都被改变

      参考

  • 深入理解System.arraycopy内部原理

  • System.arraycopy方法详解
  • 深克隆还是浅克隆