1.集合中的浅拷贝与视图

本文通过几个具体的测试案例,深入探讨了Java中集合的使用技巧及对象拷贝的机制,包括不同拷贝方式的区别及其对原始数据的影响。特别关注了浅拷贝的行为,并通过实例说明了其在实际应用中的表现。

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

@Test
    public void testCollection() {
        //List<Integer> list = Arrays.asList(1, 2, 3);//不要用这种方式,这种方式生成的是视图
        List<Integer> list = Lists.newArrayList(1, 2, 3);

        HashMap<String, List<Integer>> hashMap1 = new HashMap<>();
        hashMap1.put("aaa", list);

        HashMap<String, List<Integer>> hashMap2 = new HashMap<>(hashMap1);//浅拷贝
        Map<String, List<Integer>> view = Collections.unmodifiableMap(hashMap1);//生成视图

        hashMap1.put("bbb", Arrays.asList(3, 2, 1));

        list.add(4);

        System.out.println(hashMap2);
        System.out.println(view);
    }

以上代码运行结果

{aaa=[1, 2, 3, 4]}
{aaa=[1, 2, 3, 4], bbb=[3, 2, 1]}
 

@Test
    public void test2() {
        HashMap<String, My> hashMap1 = new HashMap<>();
        My my = new My(1);
        hashMap1.put("aa", my);

        HashMap<String, My> hashMap2 = new HashMap<>(hashMap1);

        my.setX(2);

        System.out.println(hashMap1);
        System.out.println(hashMap2);

        my = new My(3);

        System.out.println(hashMap1);
        System.out.println(hashMap2);

        hashMap1.put("aa", new My(4));

        System.out.println(hashMap1);
        System.out.println(hashMap2);
    }

运行结果:

{aa=My{x=2}}
{aa=My{x=2}}
{aa=My{x=2}}
{aa=My{x=2}}
{aa=My{x=4}}
{aa=My{x=2}}

 

Arrays.copyOf()也是浅拷贝

@Test
    public void test1() {

        CopyOnWriteArrayList<Object> arrayList = new CopyOnWriteArrayList<>();

        My my1 = new My(1);
        My my2 = new My(2);

        My[] myarr = new My[]{my1, my2};
        My[] copy = Arrays.copyOf(myarr, 2);

        my2.setX(3);

        System.out.println(Arrays.toString(myarr));
        System.out.println(Arrays.toString(copy));
    }

[My{x=1}, My{x=3}]
[My{x=1}, My{x=3}]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值