System.arraycopy()和Arrays.copyOf()是深拷贝or浅拷贝

基本类型:

Object[] src = new Object[]{12, 23, 45};
Object[] arraysCopyOf = Arrays.copyOf(src, 3);
Object[] systemArrayCopy = new Object[3];
System.arraycopy(src, 0, systemArrayCopy, 0, 3);
System.out.println("----修改数组[0]的值前----");
System.out.println("原来数组[0]的值-->" + src[0]);
System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
System.out.println("systemArrayCopy数组[0]的值-->" + systemArrayCopy[0]);
src[0] = 121;
System.out.println("----修改数组[0]的值后----");
System.out.println("原来数组[0]的值-->" + src[0]);
System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
System.out.println("systemArrayCopy数组[0]的值-->" + systemArrayCopy[0]);

输出结果:

----修改数组[0]的值前----
原来数组[0]的值-->12
arraysCopyOf数组[0]的值-->12
systemArrayCopy数组[0]的值-->12
----修改数组[0]的值后----
原来数组[0]的值-->121
arraysCopyOf数组[0]的值-->12
systemArrayCopy数组[0]的值-->12

String类型:

Object[] src = new Object[]{"12", "23", "45"};
        Object[] arraysCopyOf = Arrays.copyOf(src, 3);
        Object[] systemArrayCopy = new Object[3];
        System.arraycopy(src, 0, systemArrayCopy, 0, 3);
        System.out.println("----修改数组[0]的值前----");
        System.out.println("原来数组[0]的值-->" + src[0]);
        System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
        System.out.println("systemArrayCopy数组[0]的值-->" + systemArrayCopy[0]);
        src[0] = "121";
        System.out.println("----修改数组[0]的值后----");
        System.out.println("原来数组[0]的值-->" + src[0]);
        System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
        System.out.println("systemArrayCopy数组[0]的值-->" + systemArrayCopy[0]);

输出结果:

----修改数组[0]的值前----
原来数组[0]的值-->12
arraysCopyOf数组[0]的值-->12
systemArrayCopy数组[0]的值-->12
----修改数组[0]的值后----
原来数组[0]的值-->121
arraysCopyOf数组[0]的值-->12
systemArrayCopy数组[0]的值-->12

包装类型:

Object[] src = new Object[]{
                new Integer(12),
                new Integer(23),
                new Integer(45)
        };
        Object[] arraysCopyOf = Arrays.copyOf(src, 3);
        Object[] systemArrayCopy = new Object[3];
        System.arraycopy(src, 0, systemArrayCopy, 0, 3);
        System.out.println("----修改数组[0]的值前----");
        System.out.println("原来数组[0]的值-->" + src[0]);
        System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
        System.out.println("systemArrayCopy数组[0]的值-->" + systemArrayCopy[0]);
        src[0] = new Integer(121);
        System.out.println("----修改数组[0]的值后----");
        System.out.println("原来数组[0]的值-->" + src[0]);
        System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
        System.out.println("systemArrayCopy数组[0]的值-->" + systemArrayCopy[0]);

输出结果:

----修改数组[0]的值前----
原来数组[0]的值-->12
arraysCopyOf数组[0]的值-->12
systemArrayCopy数组[0]的值-->12
----修改数组[0]的值后----
原来数组[0]的值-->121
arraysCopyOf数组[0]的值-->12
systemArrayCopy数组[0]的值-->12

其他类型:

Object[] src = new Object[]{
                User.builder().name("张三").age(21).build(),
                User.builder().name("张三1").age(22).build(),
                User.builder().name("张三2").age(23).build()
        };
        Object[] arraysCopyOf = Arrays.copyOf(src, 3);
        Object[] systemArrayCopy = new Object[3];
        System.arraycopy(src, 0, systemArrayCopy, 0, 3);
        System.out.println("----修改数组[0]的值前----");
        System.out.println("原来数组[0]的值-->" + src[0]);
        System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
        System.out.println("systemArrayCopy数组[0]的值-->" + systemArrayCopy[0]);
        User user = (User) src[0];
        user.setName("张三三");
        user.setAge(211);
        System.out.println("----修改数组[0]的值后----");
        System.out.println("原来数组[0]的值-->" + src[0]);
        System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
        System.out.println("systemArrayCopy数组[0]的值-->"+systemArrayCopy[0]);
@Data
@Builder
class User {
    private String name;
    private Integer age;
}

输出结果:

----修改数组[0]的值前----
原来数组[0]的值-->User(name=张三, age=21)
arraysCopyOf数组[0]的值-->User(name=张三, age=21)
systemArrayCopy数组[0]的值-->User(name=张三, age=21)
----修改数组[0]的值后----
原来数组[0]的值-->User(name=张三三, age=211)
arraysCopyOf数组[0]的值-->User(name=张三三, age=211)
systemArrayCopy数组[0]的值-->User(name=张三三, age=211)

总结:

Arrays.copyOf(T[] orignial,int newLength)和System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)

相对于数组而言,都是创建了一个新的数组,是深拷贝;

相对于数组元素而言,当数组为一维数组,并且元素是基本类型、String、包装类型时都是深拷贝,其他类型是浅拷贝。

 

欢迎关注我的博客,获取更多精品知识合集

如果觉得对您有帮助的话,请帮我点赞、分享!您的支持是我不竭的创作动力!

欢迎关注我的公众号,获取更多技术知识分享

posted @ 2022-05-14 19:44  李润  阅读(424)  评论(0编辑  收藏  举报