Java 多维数组的深拷贝实现技巧

秋萱君_2515

秋萱君_2515

2026-06-18

517人浏览

原创

java多维数组深拷贝需逐层递归复制,因clone()等方法仅浅拷贝;基本类型二维数组可用双层循环赋值,可变对象则需确保元素支持深拷贝。

java 多维数组的深拷贝实现技巧

Java 多维数组的深拷贝不能靠 clone()、Arrays.copyOf() 或 System.arraycopy() 一步到位——这些方法对二维及以上数组都只做浅拷贝,即复制外层数组引用,内层数组仍共享内存。真正隔离数据,必须逐层递归复制。

一、二维数组:手动嵌套循环 + 元素克隆

适用于基本类型二维数组(如 int[][])或元素为不可变对象(如 String[][])的情况;若元素是可变对象(如 Person[][]),需确保其支持深拷贝逻辑。

  • 基本类型二维数组:直接双层循环赋值即可,值传递天然安全
    int[][] src = {{1, 2}, {3, 4}};<br>int[][] copy = new int[src.length][];<br>for (int i = 0; i   copy[i] = src[i].clone(); // 每行用 clone() 深拷贝一维}
  • 对象二维数组:需逐行逐元素实例化或调用 clone()
    Person[][] src = ...;<br>Person[][] copy = new Person[src.length][];<br>for (int i = 0; i   if (src[i] != null) {<br>    copy[i] = new Person[src[i].length];<br>    for (int j = 0; j       copy[i][j] = src[i][j].clone(); // 要求 Person 实现 Cloneable 并重写 clone()    }<br>  }<br>}

二、通用多维数组:递归 + 反射判断维度

当维度不固定(如三维、四维)或类型复杂时,可用递归方式处理。核心是识别当前数组元素是否仍是数组,若是则递归拷贝,否则按类型处理(基本类型直接赋值,对象调用克隆或构造)。

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载
  • 用 array.getClass().getComponentType() 判断元素类型
  • 若元素类型是数组(componentType.isArray()),则递归调用深拷贝方法
  • 若元素是基本类型或不可变对象(如 String),直接复制引用或值
  • 若元素是可变对象且实现 Cloneable,调用 clone();否则建议使用构造器或序列化兜底

三、序列化方式:绕过维度限制的“无脑深拷贝”

对任意维度、任意嵌套结构(含集合、自定义对象)都有效,只要所有层级类均实现 Serializable。

  • 优点:无需关心维度、无需修改原类结构(只要可序列化)
  • 缺点:性能开销大;不支持 transient 字段;无法序列化 Lambda、本地类、部分系统类(如 Thread)
  • 示例:
    Object[][] data = ...;<br>Object[][] copy = (Object[][]) deepCopyBySerialization(data);

    其中 deepCopyBySerialization() 封装了 ObjectOutputStream / ObjectInputStream 流操作

四、第三方工具辅助:Gson 或 Jackson(适合 JSON 友好场景)

将多维数组转为 JSON 字符串再解析回对象,天然实现深拷贝(前提是对象可被 JSON 序列化)。

  • Gson 示例:
    Gson gson = new Gson();<br>String json = gson.toJson(src);<br>T[][] copy = gson.fromJson(json, typeToken);
  • 注意:会丢失运行时类型信息(如泛型擦除)、不支持非标准字段(如 transient、static)、要求无参构造器
  • 适合配置类、DTO 等纯数据结构,不适合含业务逻辑或资源句柄的对象

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

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

下载

相关标签:

java

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

相关专题

更多
java
java

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

2023.06.15

10177

6

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

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

2023.07.05

7322

9

java自学难吗
java自学难吗

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

2023.07.31

6432

8

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

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

2023.08.01

1104

3

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

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

2023.08.02

908

3

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

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

2023.08.02

1336

5

java有什么用
java有什么用

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

2023.08.02

2689

5

java在线网站
java在线网站

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

2023.08.03

20011

3

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

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

2023.08.03

1195

8

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习