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

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

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

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

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

    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> 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,师兄我就再测试一下。

大师兄最帅

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

结果:

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

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

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

所以:

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

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

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值