hello,大家好!今天九哥给大家分享一个虽然很基础,但却很常用的技能点,那就是数组的复制。
九哥之所以要给大家分享这个知识点的原因有二,首先数组是我们常用的一种存储结构,经常需要把一个数组中的元素复制到另一个数组中;另外我们在阅读集合的底层源码时,比如ArrayList集合,它的底层就是数组。
当集合扩容时,其中的一个过程就是进行数组的复制,如果我们对这个复制过程不理解,自然也就读不懂这个源码了。所以今天九哥就给大家讲解数组的三种复制方式,希望今天的内容可以帮助大家巩固基础知识。
首先我们来看看第一种数组复制方式。
一. 第一种,遍历的过程中完成数组的复制
1.代码案例
第一种数组复制方式的案例代码如下:
- public static void main(String[] args) {
- //声明数组
- int[] aryNum={12,23,34,45,56,67};
- //先输出aryNum数组里的数据
- System.out.println("aryNum数组里的元素为:");
- for(int i=0; i
- System.out.print(aryNum[i]+" ");
- }
- System.out.println("");
-
- //创建新数组,新数组的长度和原数组一致
- int[] newAryNum=new int[aryNum.length];
-
- //遍历aryNum数组,在遍历的过程中,
- //把原数组各个索引位置的元素赋值给新数组newAryNum对应的索引位置上
- for(int i=0; i
- newAryNum[i] = aryNum[i];
- }
-
- //遍历输出新数组newAryNum
- System.out.println("newAryNum数组里的元素为:");
- for(int i=0; i
- System.out.print(newAryNum[i]+" ");
- }
- }
2.运行结果如下

3. 执行结果分析
这种复制方法最简单易懂,但每次复制的时候都需要进行遍历,比较繁琐。
接下来我们再来看第二种数组复制方式。
二. 第二种,调用Arrays类中的copyOf()方法
1.源码分析
通过阅读源码我们发现,Arrays类中对copyOf()方法进行了重载,也就是能够对各种类型的数组进行复制。

我们以案例中的整形数组为例,先阅读以下复制整形数组的源码
- public static int[] copyOf(int[] original, int newLength) {
- int[] copy = new int[newLength];
- System.arraycopy(original, 0, copy, 0,
- Math.min(original.length, newLength));
- return copy;
- }
源码分析:
-
方法的参数1: original 是要复制的数组;
-
方法的参数2: newLength 是复制后的数组的长度,也可以理解为要复制几个元素,因为这个值是多少,新数组的长度就是多少;
-
方法的返回值: 就是新创建的复制之后的数组。
2.案例代码
先通过int[] copy = new int[newLength]; 创建了一个新的数组。然后调用System类的arraycopy方法完成的数组复制,后续会讲解System.arraycopy()方法。
- public static void main(String[] args) {
- //声明数组
- int[] aryNum={12,23,34,45,56,67};
- //先输出aryNum数组里的数据
- System.out.println("aryNum数组里的元素为:");
- for(int i=0; i
- System.out.print(aryNum[i]+" ");
- }
- System.out.println("");
-
- //调用Arrays.copyOf()方法,完成数组复制
- int[] newAryNum=Arrays.copyOf(aryNum,aryNum.length);
-
- //遍历输出新数组newAryNum
- System.out.println("newAryNum数组里的元素为:");
- for(int i=0; i
- System.out.print(newAryNum[i]+" ");
- }
- }
3.执行结果

最后我们再来看第三种数组复制方式。
三. 第三种,直接调用System.arraycopy()方法
1.System.arraycopy()方法分析
我们先看一下这个System.arraycopy()方法的源码声明。
- public static native void arraycopy(Object src, int srcPos,
- Object dest, int destPos,
- int length);
方法参数解析如下:
-
参数src: 要源数组,也就是要从这个数组里复制;
-
参数srcPos: 从源数组中复制元素的起始位置;
-
参数dest:目标数组,也就是复制到哪个数组中;
-
参数destPos:复制到目标数组的起始位置;
-
参数length: 要赋值的数组的元素个数。
- public static void main(String[] args) {
- //声明数组
- int[] aryNum={12,23,34,45,56,67};
- //先输出aryNum数组里的数据
- System.out.println("aryNum数组里的元素为:");
- for(int i=0; i
- System.out.print(aryNum[i]+" ");
- }
- System.out.println("");
-
- //调用Arrays.copyOf()方法
- //先自行创建一个目标数组,也就是复制后的数组
- int[] newAryNum=new int[aryNum.length];
- System.arraycopy(aryNum,0,newAryNum,0,aryNum.length);
-
- //遍历输出新数组newAryNum
- System.out.println("newAryNum数组里的元素为:");
- for(int i=0; i
- System.out.print(newAryNum[i]+" ");
- }
- }
2.执行结果

3.结果分析
这种方法的好处就是比较灵活,不必复制整个数组,可以自己定义从哪个元素开始复制,以及复制多少个元素。
- //从源数组的第4个元素开始复制,共复制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