System.arraycopy()方法
用法
调用该方法时,传入源数组,源数组的起始位置,目标数组,目标数组的起始位置,要复制的元素个数
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
拷贝数值类型
public class SystemArrayCopy {
public static void main(String[] args) {
int[] arr1 = new int[4];
for (int i = 0; i < 4; i++) {
arr1[i] = i;
}
int[] arr2 = new int[4];
System.arraycopy(arr1, 0, arr2, 0, 3);
for (int i = 0; i < 4; i++) {
System.out.println(arr2[i]);
}
}
}
上述代码执行结果
0 1 2 0
拷贝引用类型(浅拷贝)
public class SystemArrayCopy {
public static void main(String[] args) {
// 拷贝数值类型
int[] arr1 = new int[4];
for (int i = 0; i < 4; i++) {
arr1[i] = i;
}
int[] arr2 = new int[4];
System.arraycopy(arr1, 0, arr2, 0, 3);
for (int i = 0; i < 4; i++) {
System.out.println(arr2[i]);
}
// 拷贝引用类型
TestArray[] testArrays1 = new TestArray[4];
for (int i = 0; i < 4; i++) {
testArrays1[i] = new TestArray(i);
}
TestArray[] testArrays2 = new TestArray[4];
System.arraycopy(testArrays1,0, testArrays2, 0, 4);
// 修改副本的值,会影响原数组
testArrays2[0].setData(1);
show(testArrays1);
show(testArrays2);
}
public static void show(TestArray[] arrays) {
for (int i = 0; i < arrays.length; i++) {
System.out.print(arrays[i].getData() + " ");
}
System.out.println();
}
}
执行结果
可以看到,副本中元素的地址和源数组元素的地址相同。
Arrays.copyOf()方法
用法
调用该方法时,传入源数组和要复制的数组长度即可。该方法内部会创建1个新的数组作为目标数组,并调用System.arraycopy方法,将源数组复制到目标数组,并返回目标数组。
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;
}
拷贝数值类型
public class ArraysCopyOf {
public static void main(String[] args) {
int[] arr1 = new int[4];
for (int i = 0; i < 4; i++) {
arr1[i] = i;
}
int[] arr2 = Arrays.copyOf(arr1, 3);
for (int i = 0; i < 4; i++) {
System.out.println(arr2[i]);
}
}
}
执行结果
0 1 2
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at arrays.ArraysCopyOf.main(ArraysCopyOf.java:13)
拷贝引用类型(浅拷贝)
结果同System.arraycopy()
Object类的clone方法
用法参考文章:Object类的常用方法-clone方法是深拷贝还是浅拷贝
拷贝数值类型
public class ObjectClone {
public static void main(String[] args) {
//拷贝基本类型
int[] arr1 = {1,2,3,4};
int[] arr2 = arr1.clone();
System.out.println(Arrays.toString(arr2));
}
}
拷贝引用类型(浅拷贝)
结果同System.arraycopy()