Arrays中 copyOf 和 System 中 arraycopy 两者的区别

【为什么会写这篇博文?】
花花❀看到 Arrays 源码中的 copyOf 方法,底层调用的是 System 中 arraycopy 方法,而且我已经掉过不止一次数组复制的坑🕳,今天就打算写个博客给我长个记性。
Arrays是一个工具类,该类中几乎所有的方法都是静态方法,也就是说可以通过类名来调用相应的方法。

首先来看以下 copyOf 源码

    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) {
        @SuppressWarnings("unchecked")
        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;
    }

【参数解析】
original:原数组
newLength:数组长度
newType:数组类型
/----------------------------------------------------------/
可以看到 Arrays 中底层的 copyOf 方法首先保证新数组的类型和原数组是相等的,再调用 System.arraycopy 方法去复制数组。
Arrays 中都调用的 System 中的方法,那么两者有什么区别呢?

我们再来看一下 System.arraycopy 方法源码

    public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

【参数解析】
src:原数组
srcPos:开始复制的位置
dest:目标数组
destPos:复制的开始位置
length:数组长度
src和dest必须是同类型或者可以进行转换类型的数组
/----------------------------------------------------------/
我们可以看出 System.arraycopy 方法为本地方法,底层的原理现在学Java的我可能需要C同学的帮助啦🤭

使用总结
copyOf 方法arraycopy 方法
调用时只需要原数组即可调用时需要原数组和目标数组
有返回值无返回值
新建一个对象,并调用arraycopy方法底层方法
扩展

一维数组的复制

一维数组的四种复制方式:

  1. for循环挨个复制
  2. 调用 System.arraycopy 方法
  3. 调用 Arrays.copyOf 方法
  4. 调用 object 中的 clone 方法

for循环太简单啦,就没测试啦,同时我们可以看出一维数组的三种方式都是 深拷贝!

public static void main(String[] args){
    int[] arr = {1,2,3};
    int[] brr =new int[3];
    System.arraycopy(arr,0,brr,0,arr.length);
    int[] crr = Arrays.copyOf(arr, arr.length);
    int[] drr = arr.clone();
    arr[0] = 0;
    System.out.println("arr:  " +Arrays.toString(arr));
    System.out.println("System.arraycopy:  " + Arrays.toString(brr));
    System.out.println("Arrays.copyOf:  " + Arrays.toString(crr));
    System.out.println("clone: " + Arrays.toString(drr));
}

运行结果

arr:  [0, 2, 3]
System.arraycopy:  [1, 2, 3]
Arrays.copyOf:  [1, 2, 3]
clone: [1, 2, 3]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值