专栏首页FunTesterArrayList浅、深拷贝

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

参考文章:


本文分享自微信公众号 - FunTester(NuclearTester),作者:八音弦

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python用递归筛选法求N以内的孪生质数(孪生素数)

    本人最近读完一本书《质数的孤独》,里面讲到孪生质数,就想查一下孪生质数的分布情况。其中主要用到了计算质数(素数)的方法,搜了一下,排名前几的都是用for循环来做...

    八音弦
  • 删除List中null的N种方法--最后放大招

    Apache Commons CollectionUtils类提供了一个filter方法,该方法也可以解决我们的目的。传入的谓词将应用于列表中的所有元素:

    八音弦
  • CyclicBarrier类在性能测试中应用

    CyclicBarrier也叫同步屏障,在JDK1.5被引入,可以让一组线程达到一个屏障时被阻塞,直到最后一个线程达到屏障时,所以被阻塞的线程才能继续执行。在执...

    八音弦
  • Java 程序执行过程的内存分析

    注:常量池具有共享的机制,不同类的常量池之间共享数据。比如:Student 类常量池下有个 "老叶"字符串常量,那么当 Test 类中用到"老叶"这个字符串常量...

    帅飞
  • Android Architecture Components Part1:Room

    Android Architecture Components(AAC)首次发布与2017 GoogleI/O大会,经过近一年的维护,现在Google团队已经发...

    Rouse
  • 烽火2640路由器命令行手册-08-服务质量配置命令

    要配置当前策略映像所用的类型映像的名字,所占带宽和队列上限,可使用策略映像配置态中的配置命令class,使用本命令的no形式从策略映像中删除某个类型映像或恢复参...

    landv
  • 0466-CDH5.16.1和CM5.16.1的新功能

    Fayson在2018年的6月15日介绍了《CDH5.15和CM5.15的新功能》,今天11月29日,Cloudera正式发布CDH5.16.1。从5.15到5...

    Fayson
  • 传输层安全协议抓包分析之SSL/TLS

    1. 协议介绍 SSL/TLS是保护计算机网络通讯安全的一类加密协议,它们在传输层上给原先非安全的应用层协议提供加密保护,如非安全的HTTP协议即可被SSL/T...

    FB客服
  • Android sdk配置 常见问题及处理方法

    Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml Fetched ...

    用户3030674
  • 云计算术语

    全球网络的一种比喻说法,起初用于表示电话网络,现在通常用于表示 Internet。

    小诸葛

扫码关注云+社区

领取腾讯云代金券