System.arraycopy()和Arrays.copyOf()方法区别

System.arraycopy()

以add方法为例:

   /**
     * 在此列表中的指定位置插入指定的元素。 
     * 先调用 rangeCheckForAdd 对index进行界限检查;然后调用 ensureCapacityInternal 方法保证capacity足够大;
     * 再将从index开始之后的所有成员后移一个位置;将element插入index位置;最后size加1。
     */
    public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1); 
        
        //arraycopy()方法实现数组自己复制自己
        /**
        	elementData : 源数组;
        	index : 源数组中的起始位置;
        	elementData : 目标数组;
        	index + 1 : 目标数组中的起始位置;
         	size - index : 要复制的数组元素的数量;
         */
        System.arraycopy(elementData, index, elementData, index + 1, size - index);
        elementData[index] = element;
        size++;
    }

简单的方法测试:

public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] a = new int[10];
        int[] b = new int[10];
        a[0] = 1;
        a[1] = 2;
        a[2] = 3;
        a[3] = 4;
        System.out.println("原数组:");
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i]+" ");
        }

        System.arraycopy(a, 2, b, 3, 2);
        b[2]=7;
        System.out.println();
        System.out.println("处理之后数组:");
        for (int i = 0; i < b.length; i++) {
            System.out.print(b[i]+" ");
        }
    }

System.arraycopy()和Arrays.copyOf()方法区别_第1张图片

Arrays.copyOf()方法

主要是为了给原有数组扩容。

	/**
     	以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。 
     */
    public Object[] toArray() {
    	//elementData:要复制的数组;size:要复制的长度
        return Arrays.copyOf(elementData, size);
    }

区别:
arraycopy() 需要目标数组,将原数组拷贝到你自己定义的数组里或者原数组,而且可以选择拷贝的起点和长度以及放入新数组中的位置 copyOf() 是系统自动在内部新建一个数组,并返回该数组。

你可能感兴趣的:(System.arraycopy()和Arrays.copyOf()方法区别)