当前位置: 首页 > article >正文

Java的List中的各种浅拷贝和深拷贝问题

先来看一组代码

public class Temp{
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        List<Integer> temp  = list;
        list.add(4);
        System.out.println(list.toString());
        System.out.println(temp.toString());
    }
}

运行结果为:
[1, 2, 3, 4]
[1, 2, 3, 4]

这表明temp是指向的list的地址而不是拷贝了完整的一份是浅拷贝,那么我们如何才能让双方互不影响。
先来看看基本数据类型。这里参考ArrayList源码里面的拷贝实现过程。

import java.util.*;

public class Temp{
    public static void main(String[] args) {
        int[] a = new int[5];
        a[0]=1;
        a[1]=2;
        a[2]=3;
        a[3]=4;
        int[] b= a;
        a[4]=9;
        for(int x:a)
            System.out.print(x);
        System.out.println();
        for(int x:b)
            System.out.print(x);
    }
}

结果也是相同的情况
12349
12349
我们知道ArrayList源码里主要用到了两个拷贝函数分别是Arrays.copyOf()和System.arraycopy()

import java.util.*;

public class Temp{
    public static void main(String[] args) {
        int[] a = new int[5];
        a[0]=1;
        a[1]=2;
        a[2]=3;
        a[3]=4;
        int[] b= Arrays.copyOf(a, a.length);
        a[4]=9;
        for(int x:a)
            System.out.print(x);
        System.out.println();
        for(int x:b)
            System.out.print(x);
    }
}
import java.util.*;

public class Temp{
    public static void main(String[] args) {
        int[] a = new int[5];
        int[] b = new int[5];
        a[0]=1;
        a[1]=2;
        a[2]=3;
        a[3]=4;
        System.arraycopy(a, 0, b, 0, a.length);;
        a[4]=9;
        for(int x:a)
            System.out.print(x);
        System.out.println();
        for(int x:b)
            System.out.print(x);
    }
}

这两个结果都是
12349
12340
实现了深拷贝
再回到List,我们可以使用Collections.copy实现深拷贝

public class Temp{
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        List<Integer> temp = new ArrayList<>();
        temp.add(2);
        temp.add(3);
        temp.add(4);
        Collections.copy(temp, list);;
        list.add(4);
        System.out.println(list.toString());
        System.out.println(temp.toString());
    }
}

注意:拷贝的过程中,长度一定要把控好,不要溢出,不会自动扩容的


http://www.kler.cn/a/161880.html

相关文章:

  • 软件工程概论项目(二),node.js的配置,npm的使用与vue的安装
  • vue中如何关闭eslint检测?
  • 一种基于深度学习的反无人机无人值守系统及方法
  • 灰狼优化算法
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十三:将AVFrame转换成AVPacket。视频编码原理.编码相关api
  • aws(学习笔记第十二课) 使用AWS的RDS-MySQL
  • 超大规模集成电路设计----FPGA时序模型及FSM的设计(八)
  • 查看端口号是否被占用
  • 指针数组和数组指针作为形式参数
  • SmartChart:一站式数据可视化解决方案
  • SpringBoot:SpringMVC(上)
  • 2023-12-04 AIGC-Stable Diffusion和SadTalker-搭建及使用
  • Linux_CentOS_7.9 VNC安装卸载以及相关配置开机自启动服务简易记录
  • 字符串排序
  • 【华为数据之道学习笔记】3-2 基础数据治理
  • JavaEE之多线程编程(一):基础篇
  • 手机升级到iOS15.8后无法在xcode(14.2)上真机调试
  • ubuntu 14.04的git 错误: gnutls_handshake() failed: Handshake failed
  • 华为云安全组规则
  • Android 11.0 MTK Camera2 设置默认拍照尺寸功能实现
  • vue3日常知识点学习归纳
  • 第 7 部分 — 增强 LLM 安全性的策略:数学和伦理框架
  • 微前端 -- wujie 预加载和原理 无界传参
  • 探索图像生成中的生成对抗网络 (GAN) 世界
  • 唯创知音WTV380语音芯片高品质声音播放提示IC在骨盆按摩器上的应用介绍
  • 1、命名空间、C++的复合类型、缺省参数