怎么用System.arraycopy解决深浅拷贝误区的数据污染

冬墨吖_8329

冬墨吖_8329

2026-05-29

454人浏览

原创

System.arraycopy仅执行浅拷贝,不解决数据污染;基本类型数组和String[]安全,对象数组及多维数组需手动深拷贝,arraycopy仅可作为深拷贝中的高效搬运工具。

怎么用system.arraycopy解决深浅拷贝误区的数据污染

System.arraycopy 本身不做深拷贝,它只负责高效搬运内存块。所谓“解决数据污染”,其实是认清它只做浅拷贝,并在该用深拷贝的地方主动绕开它、补足逻辑。

一、先分清什么时候是真安全(无需深拷贝)

基本类型数组(int[]、double[]、boolean[] 等)用 arraycopy 是安全的——复制的是数值本身,改副本不影响原数组。

  • 例如:int[] src = {1, 2, 3}; int[] dst = new int[3]; System.arraycopy(src, 0, dst, 0, 3); → 修改 dst[0] = 99,src 完全不变
  • String[] 也通常安全:因为 String 不可变,即使引用共享,也无法通过修改影响对方

二、识别高危场景:对象数组和多维数组

只要数组元素是可变对象(如 ArrayList、自定义类实例、StringBuilder),或数组本身是二维(int[][]、String[][]),arraycopy 就只复制引用,不复制对象内容。

  • Person[] p1 = {new Person("Alice")}; Person[] p2 = new Person[1]; System.arraycopy(p1, 0, p2, 0, 1); → p1[0] == p2[0] 为 true;改 p2[0].name,p1[0].name 同步变
  • int[][] grid = {{1,2}, {3,4}}; int[][] copy = new int[2][]; System.arraycopy(grid, 0, copy, 0, 2); → copy[0] == grid[0],仍是同一数组对象

三、需要深拷贝时,arraycopy 只能当“搬运工”,不能当“克隆器”

它可加速子步骤,但不能替代深拷贝逻辑。正确做法是:先分配新结构,再用 arraycopy 搬数值/引用,最后对每个可变元素单独克隆。

  • 对一维对象数组:先新建目标数组,用 arraycopy 复制引用,再遍历调用 clone() 或构造新实例
  • 对二维数组:需两层循环 —— 外层分配新行数组,内层用 arraycopy 拷贝每行内容(若元素是基本类型);若行内也是对象,则每行还要逐个深拷贝
  • 示例(二维 int[][] 深拷贝):
    int[][] src = {{1,2},{3,4}};
    int[][] dst = new int[src.length][];
    for (int i = 0; i   dst[i] = new int[src[i].length];
      System.arraycopy(src[i], 0, dst[i], 0, src[i].length); // 这里才真正安全
    }

四、警惕“伪深拷贝”惯用写法

别误以为 list.clone() 或 arr.clone() 是深拷贝——它们底层都调了 arraycopy,只复制外层数组,对元素或子数组完全不处理。

  • ArrayList list = new ArrayList(); list.add(new StringBuilder("a"));
    ArrayList copy = (ArrayList) list.clone(); → copy.get(0).append("b") 会同时改变 list.get(0)
  • 想真正隔离,必须:new ArrayList(list.stream().map(sb -> new StringBuilder(sb)).collect(Collectors.toList())),或手动遍历构造
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

11437

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8542

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7352

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1224

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

988

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1456

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

3009

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20271

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1315

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习