Arrays.copyOf()和System.arraycopy()方法

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().

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值