java语言提供了很多的方法来对数组进行复制。
其中我们常用的方法有三种:arraycopy(),copyOf()和copyOfRange()。
一、基本用法
1. arraycopy()方法
函数原型:
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
src: 原数组
srcPos:原数组起始的位置
dest:目的数组
destPos:目的数组的起始位置
length:所需复制数组的长度
需要注意的是要重新声明一个同类型且长度足够的数组,否则会出现异常。
下面举个例子:
import java.util.Arrays;
public class Example5_20_3 {
public static void main(String[] args) {
int[] a={1,4,6,45,3,2,56,76,5,4,3,4,5,6};
int[] b=new int[8];//注意数组的长度
System.arraycopy(a, 0, b, 0, 8);
System.out.println(Arrays.toString(b));
}
}
System.arraycopy(a ,0 ,b ,0 ,8)这句话可以翻译为:
把数组a从下标为0的位置依次开始复制到数组b下标为0的位置,复制长度为8。
输出的结果是:
[1, 4, 6, 45, 3, 2, 56, 76]
arraycopy()方法的主要缺点是必须事先创建好目的数组。
2.copyOf()方法
函数原型:
copyOf(oringinal, int newlength)
oringinal:原数组
newlength:复制数组的长度
这个方法是从原数组的起始位置开始复制,复制的长度是newlength。相比较于前一种,这种相当于特殊的情况,只能从原数组的起始位置开始复制。
import java.util.Arrays;
public class Example5_20_4 {
public static void main(String[] args) {
int[] a= {3,456,4,3,2,45,5,65,35,6,5,5,43};
int[] b=new int[8];
b=Arrays.copyOf(a, 8);
System.out.println(Arrays.toString(b));
}
}
输出的结果是:
[3, 456, 4, 3, 2, 45, 5, 65]
3.copyOfRange()方法
函数原型:
copyOfRange(oringinal,int from, int to)
该方法是从original数组的下标from开始复制,到下标to结束
import java.util.Arrays;
public class Example5_20_5 {
public static void main(String[] args) {
int[] a= {3,45,32,42,34,2,1,57,4,3,56,4,65};
int[] b=new int[8];
b=Arrays.copyOfRange(a, 2, 10);
System.out.print(Arrays.toString(b));
}
}
输出的结果:
[32, 42, 34, 2, 1, 57, 4, 3, 56]
这几个数组复制方法是我们最常用的方法。方法的函数体都比较简单,只是我们平时遇到这些方法的次数不多,且比较分散,导致很多人对这些方法都不熟悉。现在我把我们最常用的方法给罗列到一起,希望对大家有所帮助。
二、效率比较
对常见的数组复制方法做一下简单的比较:
1.Arrays.copyOf
本质上调用了System.arraycopy,所以效率应该 比arraycopy低
2.Arrays.copyOfRange
它和Arrays.copyOf 唯一的差别就是复制数组时可以选择范围
3.System.arraycopy
System.arraycopy (
//将指定源数组中的数组从指定位置复制到目标数组的指定位置。
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
)
4.for循环
简单实用,但代码比较多
5.clone
// 一般需要类型强转,这是它的源码,返回的是Object类型
clone()(
// 创建并返回此对象的副本。
protected Object clone()
)
6.总结
经过多次测验,将出现次数最多的时间作为标准时间,每种复制方法和结果如上所示。
从而可以得出的结论是for循环远低于其他几种方法,大致的效率由高到低应该是:
System.arraycopy > clone > (Arrays.copyOf、Arrays.copyOfRange) > for循环。
参考:https://blog.csdn.net/just16cz/article/details/80385101
https://blog.csdn.net/zhoukewei_1650/article/details/83005002