JAVA不常用的方法——System.arraycopy()

本文详细解析了Java中System.arraycopy()方法的使用,包括其参数意义、如何在不同情况下复制数组元素,以及在ArrayList源码中的应用。通过具体示例展示了如何通过此方法实现数组元素的高效复制和移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

System中有很多不常用的方法,基本上都是native修饰方法,虽然不常用,但是可以有助于我们理解JDK的源码。

比如:arraycopy()在ArrayList中就用到了。

先说明一下该方法作用是:从一个数组中选择一些元素赋值到另一个数组中。

arraycopy源码:

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

解释一下参数是什么意思:

Object src:原数组。
int  srcPos:从原数组的起始位置开始。
Object dest:目标数组。
int destPos:目标数组的开始位置。
int length:要复制原数组的长度。

示例:

 int[] src = new int[]{1, 2, 3, 4, 5};
 int[] dest = new int[5];

 System.arraycopy(src, 0, dest, 0, 5);

 for (int a : src) {
     System.out.print(a + " ");
 }
 System.out.println("");
 for (int a : dest) {
     System.out.print(a + " ");
 }
--输出结果:
-- 1 2 3 4 5 
-- 1 2 3 4 5 

注意下上面和下面两个例子的区别,dest数组在下面例子中有6个元素,都是9,复制之后dest的前5个元素变成了1 2 3 4 5 

        int[] src = new int[]{1, 2, 3, 4, 5};
        int[] dest = new int[]{9, 9, 9, 9, 9, 9};

        System.arraycopy(src, 0, dest, 0, 5);

        for (int a : src) {
            System.out.print(a + " ");
        }
        System.out.println("");
        for (int a : dest) {
            System.out.print(a + " ");
        }
-- 输出结果
-- 1 2 3 4 5
-- 1 2 3 4 5 9

如果dest长度是10,复制的元素只有5个,则其余自动补0,如下:

  int[] src = new int[]{1, 2, 3, 4, 5};
  int[] dest = new int[10];

  System.arraycopy(src, 0, dest, 3, 5);

  for (int a : src) {
      System.out.print(a + " ");
  }
  System.out.println("");
  for (int a : dest) {
      System.out.print(a + " ");
  }
-- 输出结果:
-- 1 2 3 4 5
-- 0 0 0 1 2 3 4 5 0 0

还有像是ArrayList源码中add(int index , E element)方法

    public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  
        System.arraycopy(elementData, index, elementData, index + 1, size - index);
        elementData[index] = element;
        size++;
    }

我们都知道ArrayList的底层是使用数组存储元素的,所以这个意思就是在往List中通过从方法添加元素时,会先将数组中index后面的元素复制到index后面,也就是将index后面的元素都往后移一位,在将新元素element添加到index这个位置。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值