zoukankan      html  css  js  c++  java
  • Java中 System.arraycopy() 和 Arrays.copyOf()方法

    System.arraycopy()Arrays.copyOf()方法

    阅读源码的话,我们就会发现 ArrayList 中大量调用了这两个方法。比如:我们上面讲的扩容操作以及add(int index, E element)toArray() 等方法中都用到了该方法!

    System.arraycopy() 方法

        /**
         * 在此列表中的指定位置插入指定的元素。 
         *先调用 rangeCheckForAdd 对index进行界限检查;然后调用 ensureCapacityInternal 方法保证capacity足够大;
         *再将从index开始之后的所有成员后移一个位置;将element插入index位置;最后size加1。
         */
        public void add(int index, E element) {
            rangeCheckForAdd(index);
    
            ensureCapacityInternal(size + 1);  // Increments modCount!!
            //arraycopy()方法实现数组自己复制自己
            //elementData:源数组;index:源数组中的起始位置;elementData:目标数组;index + 1:目标数组中的起始位置; size - index:要复制的数组元素的数量;
            System.arraycopy(elementData, index, elementData, index + 1, size - index);
            elementData[index] = element;
            size++;
        }
    

    我们写一个简单的方法测试以下:

    public class ArraycopyTest {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int[] a = new int[10];
    		a[0] = 0;
    		a[1] = 1;
    		a[2] = 2;
    		a[3] = 3;
    		System.arraycopy(a, 2, a, 3, 3);
    		a[2]=99;
    		for (int i = 0; i < a.length; i++) {
    			System.out.println(a[i]);
    		}
    	}
    
    }
    

    结果:

    0 1 99 2 3 0 0 0 0 0 
    

    Arrays.copyOf()方法

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

    个人觉得使用 Arrays.copyOf()方法主要是为了给原有数组扩容,测试代码如下:

    public class ArrayscopyOfTest {
    
    	public static void main(String[] args) {
    		int[] a = new int[3];
    		a[0] = 0;
    		a[1] = 1;
    		a[2] = 2;
    		int[] b = Arrays.copyOf(a, 10);
    		System.out.println("b.length"+b.length);
    	}
    }
    

    结果:

    10
    

    两者联系和区别

    联系:

    看两者源代码可以发现 copyOf() 内部实际调用了 System.arraycopy() 方法

    区别:

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

  • 相关阅读:
    HDU题目分类
    nyoj50爱摘苹果的小明
    nyoj24大数阶乘
    hduoj1094A+B for InputOutput Practice (VI)
    nyoj198数数
    NYOJ463九九乘法表
    nyoj436sum of all integer numbers
    hduoj1042N!
    hduoj1095A+B for InputOutput Practice (VII)
    nyoj458小光棍数
  • 原文地址:https://www.cnblogs.com/Draymonder/p/10356209.html
Copyright © 2011-2022 走看看