数组的复制(Java技巧篇,四种方法详解)

  • 使用java.lang.System类中的arraycopy方法

优点:该方法可复制全部内容,也可复制一部分成为子数组,且目标数组与源数组没有关系,目标数组可以比源数组大,比较灵活。

缺点:返回值为void,所以需要手动创建目标数组。

/**
     *参数含义
     * @param      src      源数组(需要复制的数组)
     * @param      srcPos   源数组中的起始下标。!注意是下标!
     * @param      dest     目标数组(最后需要的数组)
     * @param      destPos  目标数据中的起始位置
     * @param      length   要复制的数组元素的长度。
     */
public static native void arraycopy(Object src,  
									int  srcPos,
									Object dest, 
									int destPos,
									int length);

简单使用:

    public static void main(String[] args) {
        int[] srcArray = {0,1,2,3,4,5,6,7,8,9};
        int[] destArray  = new int[5];
        
        System.arraycopy(srcArray,2,destArray,0,5);
        
        for (int i : destArray) {
            System.out.print(i+" ");
        }
    }
//结果:2 3 4 5 6 

注意点

1、不管是源数组还是目标数组,设置起始下标和长度时要准确,不要超过数组本身长度,使用不当会报IndexOutOfBoundsException异常。

2、源数组与目标数组要同类型,不能一个Int一个long或者其他的,使用不当会报ArrayStoreException异常。

3、目标数组和源数组不可为null,为null时报NullPointerException异常。

  • 使用java.util.Arrays类下的copyOf方法或copyOfRange方法

这两个方法底层是调用上述arraycopy方法实现。

copyOfcopyOfRange的区别:前者是复制全部内容,或者可在范围内自定义长度复制内容。

copyOf

/**
* 根据源数组类型选择返回值不同的copyOf方法。
* 第一个参数是源数组。
* 第二个参数是新数组的长度(可大于源数组)。
* 返回值是与源数组同类型的复制好的数组。
*
* 举例返回值为int类型数组 copyOf方法。
*/
public static int[] copyOf(int[] original, int newLength)

copyOf使用:

public static void main(String[] args) {
    int[] srcArray = {0,1,2,3,4,5,6,7,8,9};
    
    int[] destArray = Arrays.copyOf(srcArray,4);
    
    for (int i : destArray) {
        System.out.print(i+" ");
    }
}

注意点:

1、第二个参数可大于源数组,可为0,但不可为负数。为负数时会报NegativeArraySizeException异常。

2、源数组要初始化,即不能为null值。

copyOfRange

    /**
     * 参数含义
     * @param original 源数组
     * @param from 要复制范围的初始下标。(包含在内)
     * @param to 要复制范围的最终下标(不包含在内)
     * 返回值为与源数组一致。
     * 举例返回值为int类型数组 copyOfRange方法。
     */
public static int[] copyOfRange(int[] original, int from, int to)

copyOfRange的使用

public static void main(String[] args) {
    int[] srcArray = {0,1,2,3,4,5,6,7,8,9};

    int[] destArray = Arrays.copyOfRange(srcArray,1,5);
    
    for (int i : destArray) {
        System.out.print(i+" ");
    }
}

注意点:

1、copyOfRange方法中from和to参数是含左不含右,即左必右开[)。

2、参数from一定要小于等于参数to,不能大于参数to,否则会报IllegalArgumentException异常。

3、参数from一定要不能小于0,且不能大于源数组的最大下标。否则会报ArrayIndexOutOfBoundsException异常。

4、源数组要初始化,即不能为null值。

  • 使用数组的clone方法

使用:

public static void main(String[] args) {
    int[] srcArray = {0,1,2,3,4,5,6,7,8,9};
    int[] destArray = srcArray.clone();
    for (int i : destArray) {
        System.out.print(i+" ");
    }
}
总结:

1、需要全部复制数组内容使用copyOf方法和clone方法更简单。(另外两种也能实现)

2、需要复制一部分数组内容使用arraycopycopyOfRange方法,arraycopy方法需要提前创建结果数组,copyOfRange方法返回值为数组类型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大da怪i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值