Java Arrays.copyOf()和System.arraycopy()

welcome to my blog

System.arraycopy()是个native方法, 不是由java语言实现的.

函数的声明如下, 作用: 将src中的元素拷贝到dest中, 更具体一点就是, 将src中处于[srcPos, srcPos + length - 1]这段区间上的元素拷贝到dst的[destPos, destPos + length - 1]这段区间上

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

具体示例

int[] src = {2,4,6,8,10};
int length = src.length;
int[] dst = new int[10];
//下面这句的作用: 将src处于[0,length-1]这段区间上的元素拷贝到dst的[3, 3 + length - 1]这段区间上
System.arraycopy(src, 0, dst, 3, length);
System.out.println(Arrays.toString(dst));
/*
打印结果
[0, 0, 0, 2, 4, 6, 8, 10, 0, 0]
*/

可以发现, 使用System.arraycopy()进行数组的拷贝非常灵活, 可以选择拷贝的起点, 长度等参数, 其实Arrays.copyOf()就是使用System.arraycopy()实现的

Arrays.copyOf(original, length) 将源数组original中的元素拷贝到一个新数组中并返回这个新数组, 新数组的长度是length

示例1:

int[] arr = {1,3,5,7,9};
//将arr中的元素拷贝到长度为10的数组中, 并返回这个数组
int[] res = Arrays.copyOf(arr, 10);
System.out.println(Arrays.toString(res));
/*
打印结果
[1, 3, 5, 7, 9, 0, 0, 0, 0, 0]
*/

可以看到, 源数组的长度是5, 新数组的长度是10, 新数组中超出的部分取默认值
如果新数组的长度小于源数组长度会发生截断, 如下所示, 由于新数组的长度为3, 所以只会拷贝源数组的前三个元素到新数组中

示例2:

int[] arr = {1,3,5,7,9};
//将arr中的元素拷贝到长度为10的数组中, 并返回这个数组
int[] res = Arrays.copyOf(arr, 3);
System.out.println(Arrays.toString(res));
/*
打印结果
[1, 3, 5]
*/

Arrays.copyOf()源码, 以int[]数组为例

public static int[] copyOf(int[] original, int newLength) {
		//创建长度为newLength的数组
        int[] copy = new int[newLength];
        // 将original中处于[0, newLength- 1]这段区间上的元素拷贝到copy 的[0, Math.min(original.length, newLength)]这段区间上
        // Math.min(original.length, newLength)是取original.length和newLength中的较小值, 
        // 如果newLength更小, 说明original中的元素不会全部拷贝, 这样拷贝结果就会发生截断
        System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
        //返回新数组
        return copy;
    }
Arrays.copyOf()和System.arraycopy()的对比
  1. System.arraycopy()非常灵活, 可以指定从src的哪个索引处开始拷贝, 可以指定拷贝的长度, 还可以指定从dst的哪个索引处开始接收src的元素; 相比之下, Arrays.copyOf()是从src[0]开始拷贝的, 也是从dst[0]开始接收的, 而且也没法指定拷贝的长度
  2. System.arraycopy()是native方法, 不是由java语言实现的; Arrays.copyOf()是由java语言实现的, 不过底层是基于System.arraycopy()方法

你可能感兴趣的:(Java)