关于Java 拷贝数组方法 Arrays.copyOf() 是地址传递还是值传递

在看别人的关于 CopyOnWriteArrayList 这个类的时候,看到有人提出了关于:数组拷贝的方法Arrays.copyOf() 的问题,如下:
只是复制了引用地址,数组内的对象还是和旧数组一样的?

看了他的问题,我也是有点迷惑了,以前都没想过这个。既然如此,我就有如下的测试,以解心中之疑惑。

关于Java 拷贝数组方法 Arrays.copyOf() 是地址传递还是值传递_第1张图片

看了图和运行结果,可以看出来,这分明就是2个不相干的数组吗。两者是没关系。
然后再看看源码里面,是怎么在那复制数组的。

    public static  T[] copyOf(T[] original, int newLength) {
        return (T[]) copyOf(original, newLength, original.getClass());
    }

    public static  T[] copyOf(U[] original, int newLength, Class newType) {
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

可以看到,他是在方法内部,新建了一个相同类型的数组,然后调用系统方法
System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength));

original - 源数组。 
0 - 源数组中的起始位置。 
copy - 目标数组。 
0 - 目标数据中的起始位置。 
Math.min(original.length, newLength) - 要复制的数组元素的数量。

2018.08.03 更新

看到不少老铁对这个测试存在很大疑问,so,师兄我就再测试一下。

关于Java 拷贝数组方法 Arrays.copyOf() 是地址传递还是值传递_第2张图片

不是有老铁说我的第一个测试使用的是有争议的数字和字符串嘛,大师兄我就再弄个对象的。看代码名字,就是从其他地方获得三个student对象到这个数组里面,打印没复制之前的数组信息。然后修改新新数组的第0个学生的名字。然后再输出copy出来的数组和源数组,看看啥情况。

结果:

啪啪啪的打脸啦。(哎哟,,,,疼,,,,疼,,,,疼,,,,疼,,,,疼,,,)

虽然copy出来的是新数组没错。

但是新旧数组都是指向同一个引用滴,哦 my god 。

所以:

最后的结论是:Java 拷贝数组方法 Arrays.copyOf() 是地址传递。

感谢留言的小伙伴,不然师兄我就误人子弟啦。

你可能感兴趣的:(java)