行业资讯 2025年08月6日
0 收藏 0 点赞 559 浏览 2839 个字
摘要 :

文章目录 1.创建数组的浅拷贝 1.1. 使用Object.clone()方法 1.2. 使用Arrays.copyOf() 1.3. 使用System.arraycopy() 2.创建数组的深拷贝 学习如何在Java中创建数组副……




  • 1.创建数组的浅拷贝
    • 1.1. 使用Object.clone()方法
    • 1.2. 使用Arrays.copyOf()
    • 1.3. 使用System.arraycopy()
  • 2.创建数组的深拷贝

学习如何在Java中创建数组副本。我们将学习使用易于理解的示例来创建浅拷贝和深拷贝数组。

1.创建数组的浅拷贝

在浅拷贝中,数组项的引用被复制到新数组中,因此对数组或数组项的任何更改都会在克隆的复制数组中可见。数组的clone()方法创建浅拷贝。让我们通过一些在Java中创建数组浅拷贝的方法来了解一下。

1.1. 使用Object.clone()方法

在Java中,要创建数组的克隆,我们应该使用array.clone()。它创建数组的浅拷贝。默认克隆总是创建数组的浅拷贝。对原始数组的任何更改也会反映在克隆数组中。

Employee[] clonedArray = empArray.clone();

让我们看一个例子。当我们对empArray的项目进行更改时,克隆数组中的项目也会发生更改。

Employee[] empArr = new Employee[2];  //原数组
empArr[0] = new Employee(100, \"Lokesh\", \"Gupta\", new Department(1, \"HR\"));
empArr[1] = new Employee(200, \"Pankaj\", \"Kumar\", new Department(2, \"Finance\"));
Employee[] clonedArray = empArray.clone();  //浅拷贝数组
empArray[0].setFirstName(\"Unknown\");
empArray[0].getDepartment().setName(\"Unknown\");
System.out.println(empArray[0].getFirstName());           //Unknown
System.out.println(empArray[0].getDepartment().getName());      //Unknown
System.out.println(clonedArray[0].getFirstName());          //Unknown
System.out.println(clonedArray[0].getDepartment().getName());   //Unknown

1.2. 使用Arrays.copyOf()

Arrays.copyOf(array, newLength)方法复制指定的数组,将其截断或填充默认值,以使复制的数组具有指定的newLength。

copyOf()是一个重载的方法,因此要填充到空位的默认值取决于数组中元素的类型。例如,布尔数组将填充为false,整数数组将填充为0。对象类型将填充为null。

Employee[] empArr = new Employee[2];
Employee[] copiedArray = Arrays.copyOf(empArray, empArr.length);

1.3. 使用System.arraycopy()

JDK提供的另一个有用的方法。它是一个本地方法,并且在内部也在Arrays.copyOf()方法内部调用。但是,由于在调用时使用了多个参数,这使得代码稍微难以阅读。

arraycopy()方法将从srcArray(起始位置srcPos)复制项目到destArray(起始位置destPos)。要复制的项目数量由length参数指定。

public static native void arraycopy(Object srcArray,  int  srcPos, Object destArray, int destPos, int length);

在下面的示例中,将从names数组中复制所有项目到copyOfNames数组,从两个数组的零位置开始。

String[] names = {\"Alex\", \"Brian\", \"Charles\", \"David\"};
String[] copyOfNames = new String[names.length];
System.arraycopy(names, 0, copyOfNames, 0, copyOfNames.length);
System.out.println(Arrays.toString(names));     //[Alex, Brian, Charles, David]
System.out.println(Arrays.toString(copyOfNames));   //[Alex, Brian, Charles, David]

2.创建数组的深拷贝

在深拷贝中,数组项的新实例被创建,因此对原始数组的任何更改不会反映在复制的数组上。内存序列化是在Java中创建对象的深拷贝的一种快捷方式。如果您想在Java中创建数组的深拷贝,那么请使用Apache Common的SerializationUtils.clone(array)方法。

Employee[] copiedArray = SerializationUtils.clone(empArray);  //深拷贝数组

让我们通过一个示例来验证。

Employee[] empArray = new Employee[2];
empArray[0] = new Employee(100, \"Lokesh\", \"Gupta\", new Department(1, \"HR\"));
empArray[1] = new Employee(200, \"Pankaj\", \"Kumar\", new Department(2, \"Finance\"));
Employee[] copiedArray = SerializationUtils.clone(empArray);  //深拷贝数组
empArray[0].setFirstName(\"Unknown\");
empArray[0].getDepartment().setName(\"Unknown\");
//Verify the change in original array - \"CHANGED\"
System.out.println(empArray[0].getFirstName());           //Unknown
System.out.println(empArray[0].getDepartment().getName());      //Unknown
//Verify the change in deep copied array - \"UNCHANGED\"
System.out.println(copiedArray[0].getFirstName());          //Lokesh
System.out.println(copiedArray[0].getDepartment().getName());   //HR

以上就是Java 数组克隆 – 深拷贝和浅拷贝的全部内容。

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/9294.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号