• 常用技能点:Java中数组复制的三种方式


    hello,大家好!今天九哥给大家分享一个虽然很基础,但却很常用的技能点,那就是数组的复制。

    九哥之所以要给大家分享这个知识点的原因有二,首先数组是我们常用的一种存储结构,经常需要把一个数组中的元素复制到另一个数组中;另外我们在阅读集合的底层源码时,比如ArrayList集合,它的底层就是数组。

    集合扩容时,其中的一个过程就是进行数组的复制,如果我们对这个复制过程不理解,自然也就读不懂这个源码了。所以今天九哥就给大家讲解数组的三种复制方式,希望今天的内容可以帮助大家巩固基础知识。

    首先我们来看看第一种数组复制方式。

    一. 第一种,遍历的过程中完成数组的复制

    1.代码案例

    第一种数组复制方式的案例代码如下:

    1. public static void main(String[] args) {
    2.     //声明数组
    3.     int[] aryNum={12,23,34,45,56,67};
    4.     //先输出aryNum数组里的数据
    5.     System.out.println("aryNum数组里的元素为:");
    6.     for(int i=0; i
    7.         System.out.print(aryNum[i]+" ");
    8.     }
    9.     System.out.println("");
    10.     //创建新数组,新数组的长度和原数组一致
    11.     int[] newAryNum=new int[aryNum.length];
    12.     //遍历aryNum数组,在遍历的过程中,
    13.     //把原数组各个索引位置的元素赋值给新数组newAryNum对应的索引位置上
    14.     for(int i=0; i
    15.         newAryNum[i] = aryNum[i];
    16.     }
    17.     
    18.     //遍历输出新数组newAryNum
    19.     System.out.println("newAryNum数组里的元素为:");
    20.     for(int i=0; i
    21.         System.out.print(newAryNum[i]+" ");
    22.     }
    23. }

    2.运行结果如下

    3. 执行结果分析

    这种复制方法最简单易懂,但每次复制的时候都需要进行遍历,比较繁琐。

    接下来我们再来看第二种数组复制方式。

    二. 第二种,调用Arrays类中的copyOf()方法

    1.源码分析

    通过阅读源码我们发现,Arrays类中对copyOf()方法进行了重载,也就是能够对各种类型的数组进行复制。

    我们以案例中的整形数组为例,先阅读以下复制整形数组的源码

    1. public static int[] copyOf(int[] original, int newLength) {
    2.     int[] copy = new int[newLength];
    3.     System.arraycopy(original, 0copy0,
    4.                      Math.min(original.length, newLength));
    5.     return copy;
    6. }

    源码分析:

    • 方法的参数1: original 是要复制的数组;

    • 方法的参数2: newLength 是复制后的数组的长度,也可以理解为要复制几个元素,因为这个值是多少,新数组的长度就是多少;

    • 方法的返回值: 就是新创建的复制之后的数组。

    2.案例代码

    先通过int[] copy = new int[newLength]; 创建了一个新的数组。然后调用System类的arraycopy方法完成的数组复制,后续会讲解System.arraycopy()方法。

    1. public static void main(String[] args) {
    2.     //声明数组
    3.     int[] aryNum={12,23,34,45,56,67};
    4.     //先输出aryNum数组里的数据
    5.     System.out.println("aryNum数组里的元素为:");
    6.     for(int i=0; i
    7.         System.out.print(aryNum[i]+" ");
    8.     }
    9.     System.out.println("");
    10.     
    11.     //调用Arrays.copyOf()方法,完成数组复制
    12.     int[] newAryNum=Arrays.copyOf(aryNum,aryNum.length);
    13.     //遍历输出新数组newAryNum
    14.     System.out.println("newAryNum数组里的元素为:");
    15.     for(int i=0; i
    16.         System.out.print(newAryNum[i]+" ");
    17.     }
    18. }

    3.执行结果

    最后我们再来看第三种数组复制方式。

    三. 第三种,直接调用System.arraycopy()方法

    1.System.arraycopy()方法分析

    我们先看一下这个System.arraycopy()方法的源码声明。

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

    方法参数解析如下:

    • 参数src: 要源数组,也就是要从这个数组里复制;

    • 参数srcPos: 从源数组中复制元素的起始位置;

    • 参数dest:目标数组,也就是复制到哪个数组中;

    • 参数destPos:复制到目标数组的起始位置;

    • 参数length: 要赋值的数组的元素个数。

    1. public static void main(String[] args) {
    2.     //声明数组
    3.     int[] aryNum={12,23,34,45,56,67};
    4.     //先输出aryNum数组里的数据
    5.     System.out.println("aryNum数组里的元素为:");
    6.     for(int i=0; i
    7.         System.out.print(aryNum[i]+" ");
    8.     }
    9.     System.out.println("");
    10.     //调用Arrays.copyOf()方法
    11.     //先自行创建一个目标数组,也就是复制后的数组
    12.     int[] newAryNum=new int[aryNum.length];
    13.     System.arraycopy(aryNum,0,newAryNum,0,aryNum.length);
    14.     
    15.     //遍历输出新数组newAryNum
    16.     System.out.println("newAryNum数组里的元素为:");
    17.     for(int i=0; i
    18.         System.out.print(newAryNum[i]+" ");
    19.     }
    20. }

    2.执行结果

    3.结果分析

    这种方法的好处就是比较灵活,不必复制整个数组,可以自己定义从哪个元素开始复制,以及复制多少个元素。

    1. //从源数组的第4个元素开始复制,共复制2个元素,复制到目标数组的第2个元素开始的位置
    2. System.arraycopy(aryNum,3,newAryNum,1,2);

     *威哥Java学习交流Q群:691533824
    加群备注:CSDN推荐
     

  • 相关阅读:
    MT2096 数列分段
    Android RecyclerView
    1.ClickHouse系列之Docker本地部署
    计算机毕业设计(附源码)python游戏论坛设计
    ChinaSoft 论坛巡礼 | 开源软件生态健康度量论坛
    项目在linux上的简单部署
    lesson2(补充)关于const成员函数
    STL:set/multiset容器详解
    最小生成树
    数据仓库(8)数仓事实表和维度表技术
  • 原文地址:https://blog.csdn.net/finally_vince/article/details/126386986