• 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、包装类型时都是深拷贝,其他类型是浅拷贝。

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

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

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

  • 相关阅读:
    wtl 支持托拽文件并在ListBox框中显示文件路径的方法
    提升本程序进程优先级和权限(VC++源代码)
    Win7下运行VC程序UAC权限问题
    Flex中带for的循环
    Flex注释
    Flex建立编译环境
    Flex事件驱动机制
    Flex应用程序的系统开发周期
    Linux下c开发 之 线程通信
    将 Win32 C/C++ 应用程序迁移到 POWER 上的 Linux,第 1 部分: 进程、线程和共享内存服务
  • 原文地址:https://www.cnblogs.com/lirun/p/14958514.html
Copyright © 2020-2023  润新知