浅拷贝和深拷贝的理解 subset 如何防止引用传递 地址的传递 引用类型

本文通过具体示例探讨了Java中深拷贝与浅拷贝的区别及其应用。展示了如何使用newArrayList实现深拷贝,并解释了浅拷贝可能导致的问题。

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

问题来的来源

在这里插入图片描述
在这里插入图片描述
new ArrayList()创建了一个新的地址 底层用了copyof 是深拷贝,能输出正确答案。

在这里插入图片描述
不新建一个集合 来 赋值 subset的话 会发生引用传递 最后的subset可能是[],所以前面的元素也会变成[] (原因在图一,add的一值是同一个subset的地址,subset改变,result的所有元素跟着改变)。

自己的一个举例,开拓自己的思想,有自己的注释。

package com.itheima.test;



import java.util.ArrayList;
import java.util.List;

public class Test {

    public Test() {
    }

    public Test(List<Integer> arrayList) {
        this.arrayList = arrayList; //这里面是赋值 subset赋值给arrayList 是复制地址 浅拷贝 没有创建新的地址。
        //所以是test里面的属性的arrayList指向subset的地址,test指向的是Test类对象的地址,和subset没有关系。
        //subset指向的是 原来的ArrayList的地址 subset2 是new出来的新地址 所以是深拷贝 有参的引用类型是Collectino父接口
        //底层是copyof public ArrayList(Collection<? extends E> c) elementData = Arrays.copyOf(elementData, size, Object[].class);
    }


    public static void main(String[] args) {
        List<Integer> subset = new ArrayList<>();  //独立的集合
        subset.add(1);//[1]
        List<Integer> subset2 =new ArrayList<>(subset);  //里面是拷贝subset的值数据到集合subset2中
        Test test = new Test(subset); //类对象,里面由一个集合成员,将subset的内存地址赋值给里面的集合
        System.out.println(test);


    }

    private List<Integer> arrayList;


    /**
     * 获取
     * @return arrayList
     */
    public List<Integer> getArrayList() {
        return arrayList;
    }

    /**
     * 设置
     * @param arrayList
     */
    public void setArrayList(List<Integer> arrayList) {
        this.arrayList = arrayList;
    }

    public String toString() {
        return "Test{arrayList = " + arrayList + "}";
    }
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值