数组拷贝的四种方式
声明:本文是源码是来自基于jdk1.8,数据采用基本类型
- Arrays.copyOf()
/*此方法是一个静态方法,所以可以通过Arrays类名直接调用
*数组拷贝时先创建一个的数组,再调用System.arraycopy()方法。
*参数解析:original:要复制的数组;newLength:返回副本的长度若该值比要复制的数组original的长度更大,则将多余的结果设置为0或false
*/
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;
}
- System.arraycopy()
/*此方法是一个静态方法,并且有native修饰,表明为本地方法,执行效率高
*参数解析:
*第一个参数src:要复制的数组
*第二个参数srcPos:要复制的数组中的起始位置
*第三个参数dest:副本数组。预先创建好的数组
*第五个参数destPos:副本数组中的起始位置
*第六个参数length:要复制的数组元素的数量
*/
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
1.直接赋值
int []array={1,2,3};
int []array1=new int[3];
array1=array;
System.out.println(Arrays.toString(array)); //[1, 2, 3]
System.out.println(Arrays.toString(array1)); //[1, 2, 3]
System.out.println(array==array1); //true
2.copyOf()
int []array2={1,2,3};
int []array3=new int[3];
array3=Arrays.copyOf(array2,3); //底层创建一个新的数组,再使用System.arraycopy()进行复制
System.out.println(Arrays.toString(array2)); //[1, 2, 3]
System.out.println(Arrays.toString(array3)); //[1, 2, 3]
System.out.println(array2.toString()); //[I@74a14482
System.out.println(array3.toString()); //[I@1540e19d
System.out.println(array2 == array3); // false
3.arraycopy()
int []array4={1,2,3};
int []array5=new int[3];
//"源数组" “源数组起始位置” ”目标元素““目标数据中的起始位置”,"要复制的数组元素的数量"
System.arraycopy(array4,0,array5,0,1); //
System.out.println(Arrays.toString(array4)); //[1, 2, 3]
System.out.println(Arrays.toString(array5)); //[1, 0, 0]
System.out.println(array4.toString()); //[I@74a14482
System.out.println(array5.toString()); //[I@1540e19d
System.out.println(array4==array5); //false
4.clone()
int[] array6={1,2,3,4};
int[] array7=new int[4];
array7=array6.clone(); //基本类型的一维数组是深拷贝
System.out.println(Arrays.toString(array6)); //[1, 2, 3, 4]
System.out.println(Arrays.toString(array7)); //[1, 2, 3, 4]
System.out.println(array6.toString()); //[I@7f31245a
System.out.println(array7.toString()); //[I@6d6f6e28
System.out.println(array6==array7); //false
5.遍历
int[] array8={1,2,3};
int[] array9=new int[array8.length];
int length=array8.length;
for (int i=0;i<length;i++){
array9[i]=array8[i];
}
System.out.println(Arrays.toString(array8)); //[1, 2, 3]
System.out.println(Arrays.toString(array9)); //[1, 2, 3]
System.out.println(array8.toString()); //[I@135fbaa4
System.out.println(array9.toString()); //[I@45ee12a7
System.out.println(array8==array9); //false
总结
- ArrayList源码中很好的展示了什么时候使用Arrays.copyOf()和System.arraycopy()的实例,有兴趣的可以自行查看。
- 关于数组的复制方法和注意点还有很多,后续将单独写clone()、引用类型数据的复制、Arrays类、System类,效率问题等。
- 写在最后,由于水平有限,写的不对的地方还请评论指导。