System.arraycopy()方法实现复制
System中提供了一个native静态方法arraycopy(),可以使用这个方法来实现数组之间的复制。该方式复制是属于浅拷贝.
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
参数解析
- src: 源数组
- srcPos: 源数组复制的起始位置
- dest: 目标数组
- destPos 目标数组的起始位置
- length 需要复制的长度
简单示例
@Data
@NoArgsConstructor
@AllArgsConstructor
class Student{
private int id;
private String name;
}
@Test
void main(){
Student[] students = new Student[]{
new Student(1,"迪达拉"),
new Student(2,"角度"),
new Student(3,"自来也"),
new Student(4,"干事硅胶")
};
Student[] target = new Student[students.length];
System.arraycopy(students,0,target,0,students.length);
System.out.println("源对象是否和复制后的目标对象一致: "+(students[0]==target[0]?"浅拷贝":"深拷贝"));
//将复制后的目标数组打印
System.out.println(Arrays.toString(target));
//更改target数组元素后,students数组元素也随之改变
target[0].setName("班");
System.out.println("students[0].getName() = " + students[0].getName());
}
复制过程
Arrays.copyof()方法实现复制
源码
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
@SuppressWarnings("unchecked")
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;
}
从源码中也可看出Arrays.copyOf()方法也是调用了System.arrayCopyOf()方法,不过会先先判断传入类型是否是Object[],再根据类型初始化数组,
简单示例
void main(){
Student[] students = new Student[]{
new Student(1,"迪达拉"),
new Student(2,"角度"),
new Student(3,"自来也"),
new Student(4,"干事硅胶")
};
Student[] target = Arrays.copyOf(students,4,Student[].class);
System.out.println(Arrays.toString(target));
总结
由上可以看出两者虽然都是数组的拷贝,但是Array.copyOf()有一个new数组的过程,因此它的效率相对于System.arrayCopyOf()来说比较低,在ArrayList中add方法因为涉及到扩容,需要new一个新的数组,则使用Array.copyOf().