• 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() 是系统自动在内部新建一个数组,并返回该数组。

  • 相关阅读:
    使用youtube-dl下载B站视频
    【北邮人论坛帖子备份】14 考公与考研、入党、秋招
    观《菊次郎的夏天》有感
    git远端分支改名并以当前分支为base新建分支
    依赖明明存在pom.xml却报Dependency 'groupId:artifactId:version' not found的错
    在服务器上搭建git服务
    【北邮人论坛帖子备份】【秋招】21届渣硕BAT后端研发上岸心得
    【北邮人论坛帖子备份】【心得】做科研写论文的一些小经验
    【北邮人论坛帖子备份】 图森同学 | Gala:一个北邮非典型学霸的成长之路
    Python-for循环
  • 原文地址:https://www.cnblogs.com/Draymonder/p/10356209.html
Copyright © 2020-2023  润新知