Arrays是什么?
Arrays是用于操作数组的工具类
拷贝
System.arraycopy
从原数组的srcPos位置开始,依次拷贝length个元素到目标数组的destPos位置,其为native方法
public static native void arraycopy(Object src, int srcPos,Object dest, int destPos,int length);
copyOf
copyOf共有10个重载方法,其中8个方法针对基本数据类型数组,另外2个针对引用数据类型数组
- 下面只举例了byte[]和2个引用数据类型的方法,其他方法都类似,具体为
- 创建指定类型的数组
- 调用System.arraycopy()拷贝
public static byte[] copyOf(byte[] original, int newLength) {
byte[] copy = new byte[newLength];
System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
return copy;
}
public static <T> T[] copyOf(T[] original, int newLength) {
return (T[]) copyOf(original, newLength, original.getClass());
}
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength));
return copy;
}
copyOf是深拷贝还是浅拷贝?
- 对于基本数据类型和final修饰的引用数据类型为深拷贝
- 对于非final修饰的引用数据类型为浅拷贝
- 以下为验证过程
情况1
对于int,如下打印,说明新旧数组不会互相影响
- before change, array = [1, 2, 3]
- before change, copyArray = [1, 2, 3]
- after change, array = [1, 2, 3]
- after change, copyArray = [4, 2, 3]
int[] array = {1, 2, 3};
int[] copyArray = Arrays.copyOf(array, array.length);
System.out.println("before change, array = " + Arrays.toString(array));
System.out.println("before change, copyArray = " + Arrays.toString(copyArray));
copyArray[0] = 4;
System.out.println("after change, array = " + Arrays.toString(array));
System.out.println("after change, copyArray = " + Arrays.toString(copyArray));
对于String,如下打印,说明新旧数组不会互相影响
- before change, array = [1, 2, 3]
- before change, copyArray = [1, 2, 3]
- after change, array = [1, 2, 3]
- after change, copyArray = [4, 2, 3]
String[] array = {"1", "2", "3"};
String[] copyArray = Arrays.copyOf(array, array.length);
System.out.println("before change, array = " + Arrays.toString(array));
System.out.println("before change, copyArray = " + Arrays.toString(copyArray));
copyArray[0] = "4";
System.out.println("after change, array = " + Arrays.toString(array));
System.out.println("after change, copyArray = " + Arrays.toString(copyArray));
情况2
对于Person类
class Person {
public int age;
public Person(int age) {
this.age = age;
}
@Override
public String toString() {
return age + "";
}
}
如下打印(copyArray[0].age = 4),说明只拷贝了引用地址,未拷贝其内部数据地址
- before change, array = [1, 2, 3]
- before change, copyArray = [1, 2, 3]
- after change, array = [4, 2, 3]
- after change, copyArray = [4, 2, 3]
Person[] array = {new Person(1), new Person(2), new Person(3)};
Person[] copyArray = Arrays.copyOf(array, array.length);
System.out.println("before change, array = " + Arrays.toString(array));
System.out.println("before change, copyArray = " + Arrays.toString(copyArray));
copyArray[0].age = 4;
System.out.println("after change, array = " + Arrays.toString(array));
System.out.println("after change, copyArray = " + Arrays.toString(copyArray));
但对于如下打印(copyArray[0] = new Person(4))
- before change, array = [1, 2, 3]
- before change, copyArray = [1, 2, 3]
- after change, array = [1, 2, 3]
- after change, copyArray = [4, 2, 3]
Person[] array = {new Person(1), new Person(2), new Person(3)};
Person[] copyArray = Arrays.copyOf(array, array.length);
System.out.println("before change, array = " + Arrays.toString(array));
System.out.println("before change, copyArray = " + Arrays.toString(copyArray));
copyArray[0] = new Person(4);
System.out.println("after change, array = " + Arrays.toString(array));
System.out.println("after change, copyArray = " + Arrays.toString(copyArray));