list的addAll方法是浅拷贝

本文通过示例代码详细解析了Java中List的深拷贝与浅拷贝的区别,展示了不同类型元素拷贝的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.wp.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class ListCopyTest {

    /**
     * list1的数据addAll到list2, 位置还是一样的吗
     * 位置一样,对象也是一样的
     * 结论:
     * list的addAll方法,是浅拷贝,拷贝后,对新的list中数据更改,对原来的list中对象有影响。
     * 但是若是list中保存的是基本类型的数据,拷贝前后的数据就没有联系了。即对新的list更改,不会影响原来的list。
     * @param args
     */
    public static void main(String[] args) {
        List<FileInfo> list1 = new ArrayList<FileInfo>();
        list1.add(new FileInfo("fff", false));
        list1.add(new FileInfo("bbb", true));
        FileInfo fileInfo3 = new FileInfo("ddd", false);
        list1.add(fileInfo3);
        list1.add(new FileInfo("ccc", true));
        list1.add(new FileInfo("eee", false));
        list1.add(new FileInfo("aaa", true));

        System.out.println("-----------list1内容-----------");
        for (FileInfo fileInfo : list1) {
            System.out.print(fileInfo.getFilename()+" ");//fff bbb ddd ccc eee aaa
        }
        System.out.println();
        System.out.println("----------------------");
        List<FileInfo> list2 = new ArrayList<FileInfo>();
        list2.addAll(list1);
        
        
        list1.get(0).setFilename("123423q4");//list1中对象属性发生变化,list2中对应的对象属性也会发生变化
        list1.add(0,new FileInfo("111111111", true));//list1中增加或删除对象,list2中对象不会发生变化
        list1.remove(2);//删除ddd
        System.out.println();
        System.out.println("-----------list1内容改变后-----------");
        for (FileInfo fileInfo : list1) {
            System.out.print(fileInfo.getFilename()+" ");//123423q4 bbb ddd ccc eee aaa
        }

        Collections.sort(list1, new Comparator<FileInfo>() {

            @Override
            public int compare(FileInfo o1, FileInfo o2) {
                return o1.getFilename().compareTo(o2.getFilename());
            }
        });
        System.out.println();
        System.out.println("-----------list1排序后-----------");
        for (FileInfo fileInfo : list1) {
            System.out.print(fileInfo.getFilename()+" ");//123423q4 bbb ddd ccc eee aaa
        }//list1排序,对list2没有影响

        System.out.println();
        System.out.println("-----------list2内容-----------");
        for (FileInfo fileInfo : list2) {
            System.out.print(fileInfo.getFilename()+" ");//123423q4 bbb ddd ccc eee aaa
        }
        ///////////////////
        
        
        System.out.println();
        System.out.println("==============================");

        List<String> list3 = new ArrayList<String>();
        String one = "6666";
        list3.add(one);
        list3.add("3333");
        list3.add("4444");
        list3.add("2222");
        list3.add("5555");
        list3.add("1111");
        System.out.println();
        System.out.println("----------list3内容------------");
        for (String string : list3) {
            System.out.print(string+ " ");//6666 3333 4444 2222 5555 1111
        }
        List<String> list4 = new ArrayList<String>();
        list4.addAll(list3);
        
        list3.add(0,"0000");
        one = "test";//若list3保存的是string等基本类型的值,修改成员的值,对新的list4没有影响,即list4中的值不变。

        System.out.println();
        System.out.println("------------list3增加成员后----------");
        for (String string : list3) {
            System.out.print(string+ " ");//0000 6666 3333 4444 2222 5555 1111
        }
        System.out.println();
        System.out.println("------------list4内容----------");
        for (String string : list4) {
            System.out.print(string+ " ");//6666 3333 4444 2222 5555 1111
        }
        
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值