数组的复制

数组的复制方法我所查阅到的大概有四种,分别为使用 Arrays 类的 copyOf() 方法、copyOfRange() 方法、System 类的 arraycopy() 方法和 Object 类的 clone() 方法。这 几种方法的使用下面来分别介绍一下:

其中Arrays类的copyOf() 方法是复制数组至指定长度,copyOfRange() 方法则将指定数组的指定长度复制到一个新数组中。

1.使用 copyOf() 方法对数组进行复制

其语法格式如下:

Arrays.copyOf(dataType[] srcArray,int length);

srcArray 表示要进行复制的数组,length 表示复制后的新数组的长度。

使用这种方法复制数组时,默认从源数组的第一个元素(索引值为 0)开始复制,目标数组的长度将为 length。如果 length 大于 srcArray.length,则目标数组中采用默认值填充;如果 length 小于 srcArray.length,则复制到第 length 个元素(索引值为 length-1)即止。

注意:目标数组如果已经存在,将会被重构

例题:

  package Enum.num;
import java.util.Arrays;
public class copyNum {
    public static void main(String[] args)
    {
        //定义长度为 5 的数组
        int scores[]=new int[]{57,81,68,75,91};

        //输出源数组
        System.out.println("源数组内容如下:");

        //循环遍历源数组
        for(int i=0;i<scores.length;i++)
        {
            //将数组元素输出
            System.out.print(scores[i]+"\t");
        }

        //定义一个新的数组,将scores数组中的5个元素复制过来
        //同时留3个内存空间供以后开发使用
        int[] newScores=(int[])Arrays.copyOf(scores,8);
        System.out.println("\n复制的新数组内容如下:");

        //循环遍历复制后的新数组
        for(int j=0;j<newScores.length;j++)
        {
            //将新数组的元素输出
            System.out.print(newScores[j]+"\t");
        }
    }
}

输出结果如下:


由于源数组 scores 的长度为 5,而要复制的新数组 newScores 的长度是 8,因此在将源数组中的 5 个元素复制完之后,会采用默认值,填充剩余 3 个元素的内容。
因为源数组 scores 的数据类型为 int,而使用 Arrays.copyOf(scores,8) 方法复制数组之后返回的是 Object[] 类型,因此需要将 Object[] 数据类型强制转换为 int[] 类型。同时,也正因为 scores 的数据类型为 int,因此默认值为 0。 

2.使用 CopyOfRange() 方法对数组进行复制,其语法格式如下:

Arrays.copyOfRange(dataType[] srcArray,int startIndex,int endIndex)

srcArray 表示源数组;startIndex 表示开始复制的起始位置,目标数组中将包含起始索引对应的元素,另外,startIndex 必须在 0 到 srcArray.length 之间;endIndex 表示终止位置,目标数组中将不包含终止位置对应的元素,endIndex 必须大于等于 startIndex,可以大于 srcArray.length,如果大于 srcArray.length,则目标数组中使用默认值填充。

注意:目标数组如果已经存在,将会被重构。

代码如下:

package Enum.num;
import java.util.Arrays;
public class copyNum {
    public static void main(String[] args) {
        //定义长度为8的数组
        int scores[] = new int[]{57, 81, 68, 75, 91, 66, 75, 84};
        System.out.println("源数组内容如下:");

        //循环遍历源数组
        for (int i = 0; i < scores.length; i++) {
            System.out.print(scores[i] + "\t");
        }

        //复制源数组的前5个元素到newScores数组中
        int newScores[] = (int[]) Arrays.copyOfRange(scores, 0, 5);
        System.out.println("\n复制的新数组内容如下:");

        //循环遍历目标数组,即复制后的新数组
        for (int j = 0; j < newScores.length; j++) {
            System.out.print(newScores[j] + "\t");
        }
    }
}

运行结果:

 scores 中包含有 8 个元素,使用 Arrays.copyOfRange() 方法可以将该数组复制到长度为 5 的 newScores 数组中,取到 scores 数组前 5 个元素。

3.使用 arraycopy() 方法

处于System类中,该方法的语法如下:

System.arraycopy(dataType[]  srcArray, int srcIndex, int destArray, int  destIndex, int  length)

srcArray 表示源数组;srcIndex 表示源数组中的起始;destArray 表示目标数组;destIndex 表示目标数组中的起始位置;length 表示要复制的数组长度。
使用此方法复制数组时,length+srcIndex 必须小于等于 srcArray.length,也就是必须要在原数组的范围内, length+destIndex 必须小于等于 destArray.length。
注意:目标数组必须已经存在,且不会被重构,相当于替换目标数组中的部分元素。

 代码如下:

package Enum.num;
import java.util.Arrays;
public class copyNum {
    public static void main(String[] args) {
        //定义源数组,长度为8
        int scores[]=new int[]{100,81,68,75,91,66,75,100};

        //定义目标数组
        int newScores[]=new int[]{80,82,71,92,68,71,87,88,81,79,90,77};
        System.out.println("源数组中的内容如下:");

        //遍历源数组
        for(int i=0;i<scores.length;i++)
        {
            System.out.print(scores[i]+"\t");
        }
        System.out.println("\n目标数组中的内容如下:");

        //遍历目标数组
        for(int j=0;j<newScores.length;j++)
        {
            System.out.print(newScores[j]+"\t");
        }
        System.arraycopy(scores,0,newScores,2,8);
        //复制源数组中的一部分到目标数组中
        System.out.println("\n替换元素后的目标数组内容如下:");

        //循环遍历替换后的数组
        for(int k=0;k<newScores.length;k++)
        {
            System.out.print(newScores[k]+"\t");
        }
    }
}

运行结果,复制好原数组的值,放到目标数组的第二位往后,复制8位。

4.使用clone()方法

这个方法我是在做LeetCode了解到的,直接复制数组的值。将 scores 数组中的元素全部复制到 newScores 数组,例子如下:

package Enum.num;
import java.util.Arrays;
public class copyNum {
    public static void main(String[] args) {
        //定义源数组,长度为8
        int scores[]=new int[]{100,81,68,75,91,66,75,100};
        System.out.println("源数组中的内容如下:");

        //遍历源数组
        for(int i=0;i<scores.length;i++)
        {
            System.out.print(scores[i]+"\t");
        }

        //复制数组,将Object类型强制转换为int[]类型
        int newScores[]=(int[])scores.clone();
        System.out.println("\n目标数组内容如下:");

        //循环遍历目标数组
        for(int k=0;k<newScores.length;k++)
        {
            System.out.print(newScores[k]+"\t");
        }
    }
}

 运行结果如下(图片不知道为啥放不上来了):

源数组中的内容如下:
100	81	68	75	91	66	75	100	
目标数组内容如下:
100	81	68	75	91	66	75	100	
Process finished with exit code 0

以上就是对数组复制的基本内容啦!

get!!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值