首页 > 编程语言 >java ArrayList的深拷贝与浅拷贝

java ArrayList的深拷贝与浅拷贝

时间:2022-09-23 14:45:00浏览次数:51  
标签:java name ArrayList list Student 拷贝 age

一、前言:

ArrayList是我们经常会用到的集合类,有时候我们为了要不改变原来的数据需要重新拷贝一个新的ArrayList,今天在使用ArrayList拷贝时遇到了一些问题,这里整理并记录一下。

二、准备:

首先: ArrayList的常见的拷贝方法有很多,其中都是浅拷贝,这里介绍几种浅拷贝的方式:
1、通过构造函数方法拷贝:

List<Integer> newList = new ArrayList<>(list);

2、addAll()方法

List<Integer> newList = new ArrayList<>();
newList.addAll(list);

3、Collections.copy方法

List<Integer> newList = new ArrayList<>();
newList.addAll(list);
Collections.copy(newList, list)

4、stream 方法
java 8 的新特性

List<Integer> newList = list.stream().collect(toList());

5、ArrayList clone() 方法
clone() 方法用于拷贝一份动态数组,属于浅拷贝,使用 ArrayList clone() 方法拷贝动态数组:

import java.util.ArrayList;

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

        // 创建一个数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        System.out.println("网站列表: " + sites);


        // 对 sites 进行拷贝
        ArrayList<String> cloneSites = (ArrayList<String>)sites.clone();
        System.out.println("拷贝 ArrayList: " + cloneSites);
    }
}

深拷贝

import java.util.ArrayList;

public class TestClone {
    public static void main(String[] args) {
        ArrayList<Student> list=new ArrayList<Student>();
        //添加两个元素
        Student stJack=new Student("Jack", 13);
        Student stTom=new Student("Tom", 15);
        list.add(stJack);
        list.add(stTom);
        
        //深拷贝
        ArrayList<Student> listCopy=new ArrayList<Student>();
        for (Student student : list) {
            listCopy.add(student.clone());
        }
        //对listCopy的元素修改不影响list的元素
        listCopy.get(0).setAge(20);
        System.out.println(list);
        System.out.println(listCopy);

    }
}

class Student{
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }
    @Override
    protected Student clone(){
        Student stuent = new Student(this.name,this.age);
        return stuent;
    }

}

标签:java,name,ArrayList,list,Student,拷贝,age
From: https://www.cnblogs.com/weidaijie/p/16722669.html

相关文章

  • java使用ClassLoader加载配置文件(properties)
    importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.InputStream;importjava.util.Properties;publiccl......
  • Java Array、String、List的切片操作
    Array数组int[]test_int=newint[]{1,2,3,4,5};test_int=Arrays.copyOfRange(test_int,1,4);System.out.println(Arrays.toString(test_int));......
  • JavaScript 对象
    1.创建对象对象以键值对的方式进行存储,是一组无序的相关属性和函数方法的集合,可以通过键(属性名)访问这些值。在JavaScript中所有东西都是对象。字面量创建varobj=......
  • Java 抽象类
    抽象类概念抽象是对用户隐藏实现细节的过程,在Java中,抽象是使用抽象类和接口实现的。在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来......
  • JavaSE—第一个Java程序
    Java源文件以.java为扩展名。一个Java应用程序可以有多个Java源文件。Java应用程序的基本结构如下:一个完整的Java程序至少需要一个类(class)。因为Java是完全面向对象的......
  • 【java基础】吐血总结Stream流操作
     文章目录Stream流操作讲解在这里插入图片描述1Stream概述2Stream与传统遍历对比3Stream的创建4Stream的使用4.1遍历/匹配(foreach、find、matc......
  • JavaScript变量
    1.变量的使用 (1)声明变量      (2)输出变量 控制台打印输出结果 、2.案例练习(1)变量案例  输入代码 在控制台显示结果:  (2)变量案......
  • JAVA函数式接口与Stream流
    JAVA函数式接口与Stream流函数式接口概述函数式接口:有且仅有一个抽象方法的接口java中的函数式编程体现就是Lambda表达式,所以函数式接口就是可以适用于Lambda表达式的......
  • 计算机毕设做什么 校园桶装水配送系统 在线订水配送系统 饮用水配送系统源码 java矿泉
    ......
  • JAVA--错题本系统 个人总结
    1.static的运用,全局使用某一变量并且为了该变量不在方法中重复被调用。可以用static来放在该变量前。如:staticintnumber=0;//出题数由此可以实现改变在各个方法中是统......