java list 深拷贝_ArrayList浅、深拷贝

简介

ArrayList深拷贝和浅拷贝。ArrayListclone()方法用于创建list的浅表副本。在新列表中,仅复制对象引用。如果我们在第一个ArrayList中更改对象状态,则更改后的对象状态也将反映在克隆的ArrayList中。

浅拷贝示例

使用clone()String列表复制到新列表的Demo。

package com.fun;

import java.util.ArrayList;

public class AR  {
    
    public static void main(String[] args) {

        ArrayList<String> list = new ArrayList<>();
        list.add("one");
        list.add("two");
        list.add("three");
        list.add("four");
        list.add("give");

        System.out.println("原始对象 : " + list);

        ArrayList clonedLis = (ArrayList) list.clone();

        System.out.println("拷贝对象 : " + clonedLis);

    }


}

控制台输出:

INFO-> 当前用户:fv,IP:192.168.0.103,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.4
原始对象 : [one, two, three, four, give]
拷贝对象 : [one, two, three, four, give]

Process finished with exit code 0

浅拷贝之引用对象

示例程序将ArrayList与自定义对象进行浅表复制。克隆列表之后,修改原始对象。

package com.fun;


import java.util.ArrayList;

public class AR {

    public static void main(String[] args) {

        ArrayList<Student> list = new ArrayList<>();
        list.add(new Student(18, "fun"));
        list.add(new Student(20, "tester"));
        ArrayList<Student> clonedList = (ArrayList) list.clone();
        Student student = clonedList.get(1);
        student.name = "FunTester";
        System.out.println("原始对象 : " + clonedList);
        System.out.println("拷贝对象 : " + list);
    }


}

class Student {

    public int id;

    public String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "学生信息:id=" + id + ", name=" + name + "]";
    }


}

控制台输出:

INFO-> 当前用户:fv,IP:192.168.0.103,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.4
原始对象 : [学生信息:id=18, name=fun], 学生信息:id=20, name=FunTester]]
拷贝对象 : [学生信息:id=18, name=fun], 学生信息:id=20, name=FunTester]]

Process finished with exit code 0
  • 可以看出来浅拷贝是引用拷贝。

深度复制示例

下面的程序创建对象的深层副本。对克隆列表的修改不会影响原始列表。

package com.fun;


import com.fun.frame.httpclient.FanLibrary;

import java.util.ArrayList;

public class AR extends FanLibrary {

    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();
        list.add(new Student(100, "fun"));
        list.add(new Student(101, "tester"));
        ArrayList<Student> clonedList = new ArrayList<>();
        for (Student student : list) {
            clonedList.add(student.clone());
        }
        Student student = clonedList.get(1);
        student.name = "FunTester";
        System.out.println("Cloned list : " + clonedList);
        System.out.println("Original list : " + list);

    }


}


class Student {

    public int id;

    public String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "学生信息:id=" + id + ", name=" + name + "]";
    }

    @Override
    public Student clone() {
        return new Student(this.id, this.name);
    }


}

控制台输出:

INFO-> 当前用户:fv,IP:192.168.0.103,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.4
Cloned list : [学生信息:id=100, name=fun], 学生信息:id=101, name=FunTester]]
Original list : [学生信息:id=100, name=fun], 学生信息:id=101, name=tester]]

Process finished with exit code 0

参考文章:

  • 从JVM堆内存分析验证深浅拷贝
  • 拷贝HttpRequestBase对象

  • 郑重声明:“FunTester”首发,欢迎关注交流,禁止第三方转载。更多原创文章:FunTester原创合集

技术类文章精选

  • Linux性能监控软件netdata中文汉化版
  • 图解HTTP脑图
  • 性能测试中图形化输出测试数据
  • JMeter吞吐量误差分析
  • JMeter如何模拟不同的网络速度
  • 手机号验证码登录性能测试
  • 接口测试视频专题

无代码文章精选

  • 写给所有人的编程思维
  • 好书推荐《Java性能权威指南》
  • 自动化新手要避免的坑(上)
  • 自动化新手要避免的坑(下)
  • 如何成为全栈自动化工程师
  • 简化测试用例
  • 自动化策略六步走

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值