一次搞定:Java中数组拷贝VS数组克隆
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
在Java中,数组是一种非常重要的数据结构,而数组的拷贝和克隆在实际开发中也经常用到。但是,对于初学者来说,数组拷贝和数组克隆这两个概念可能会让他们感到困惑。因此,本文将通过讲解Java中的数组拷贝和数组克隆来帮助读者更好地掌握这两个概念。
摘要
本文将首先简要介绍Java中的数组概念,然后分别介绍数组拷贝和数组克隆的含义和用法。接着通过源代码解析,应用场景案例和优缺点分析等方面来对它们进行深入探讨。最后,本文将给出类代码方法介绍和测试用例,并进行全文小结和总结。
Java中数组拷贝VS数组克隆
简介
在Java中,数组是一组同类型数据的集合,而数组的拷贝和克隆都是对数组进行复制的操作。数组拷贝和数组克隆虽然看起来很相似,但实际上它们之间有很大的区别。
数组拷贝可以将一个数组中的数据复制到另一个数组中,而数组克隆则是创建一个新的数组对象,该对象和原始数组对象具有相同类型和大小,并且将原始数组中的所有元素逐个复制到新数组中。
源代码解析
在Java中,我们通常使用System.arraycopy()方法进行数组拷贝操作,使用数组的clone()方法进行数组克隆操作。下面是它们的用法:
数组拷贝
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
代码分析:
该代码定义了一个静态方法 arraycopy,接收 5 个参数:
src:源数组对象;srcPos:源数组中的起始位置(从 0 开始计数);dest:目标数组对象;destPos:目标数组中的起始位置(从 0 开始计数);length:要复制的元素个数。
该方法的作用是将源数组中指定位置的元素复制到目标数组中指定位置,可以用来实现数组的复制、剪切和粘贴等操作。该方法可以处理任意类型的数组对象,参数类型为 Object,需要在调用时进行类型转换。
上面的方法将从源数组src中复制数据到目标数组dest中,其中srcPos是源数组的起始位置,destPos是目标数组的起始位置,length是要复制的元素数。
下面是一个示例:
int[] srcArray = {1, 2, 3, 4, 5};
int[] destArray = new int[5];
System.arraycopy(srcArray, 0, destArray, 0, 5);
上面的代码将srcArray数组中的所有元素复制到destArray数组中。复制之后,srcArray数组和destArray数组中的数据将完全相同。
代码分析:
这段代码使用了Java中的System类的arraycopy方法。这个方法用于将一个数组的元素复制到另一个数组中。
其中,srcArray是源数组,包含要复制的元素;destArray是目标数组,即复制后的数组;0表示从源数组的第0个元素开始复制;5表示复制5个元素,即源数组中从第0个元素开始到第4个元素为止的所有元素。
因此,这段代码的作用是将srcArray数组中的所有元素复制到destArray数组中,最终得到两个数组中的元素是相同的。
数组克隆
数组克隆是通过调用数组对象的clone()方法来实现的。这个方法创建一个新的数组对象,该对象和原始数组对象具有相同类型和大小,并且将原始数组中的所有元素逐个复制到新数组中。示例如下:
int[] srcArray = {1, 2, 3, 4, 5};
int[] destArray = srcArray.clone();
上面的代码将srcArray数组克隆到destArray数组中。由于克隆后的数组和原始数组具有相同的大小和元素值,因此它们是相等的。
代码分析:
这段代码定义了一个整型数组 srcArray,其中包含了 1 到 5 这 5 个整数。然后通过调用 srcArray 的 clone() 方法,将其复制到另一个数组 destArray 中。
这样做的目的是创建一个新的数组对象,它的元素和原始数组相同,但是它们在内存中的位置是不同的,因此对其中一个数组进行修改将不会影响到另一个数组。
需要注意的是,使用 clone() 方法来复制数组时,必须确保被复制的数组是一个对象数组或基本类型数组。对于其他类型的数组,如 String 数组等,需要使用其他方法来复制。
应用场景案例
数组拷贝
在实际开发中,数组拷贝经常被用来将一个数组的数据复制到另一个数组中。例如,当我们需要对一个数组进行排序时,通常会先将原始数组复制到一个新的数组中,然后对新数组进行排序,以避免原始数组数据的改变。
另外,数组拷贝还可以用来将一个数组的部分数据复制到另一个数组中。例如:
int[] srcArray = {1, 2, 3, 4, 5};
int[] destArray = new int[3];
System.arraycopy(srcArray, 0, destArray, 0, 3);
上面的代码将srcArray数组中的前三个元素复制到destArray数组中。复制之后,destArray数组中的数据为{1, 2, 3}。
代码分析:
这段代码使用了Java中的System类的一个方法arraycopy,将srcArray中前3个元素复制到destArray中。具体来说,参数说明如下:
- srcArray:源数组,即需要复制的数组。
- 0:源数组中需要复制的起始位置,即从第0个元素开始复制。
- destArray:目标数组,即需要将数据复制到的数组。
- 0:目标数组中需要复制的起始位置,即从第0个元素开始复制。
- 3:需要复制的元素个数,即从源数组中复制前3个元素到目标数组中。
因此,经过这段代码执行后,destArray中的元素为{1, 2, 3}。注意,如果destArray的长度小于3,则会抛出ArrayIndexOutOfBoundsException异常。
数组克隆
数组克隆在实际开发中也有多种用途。例如,当我们需要对一个数组进行修改时,可以先将原始数组克隆到一个新的数组中,然后对新数组进行修改,以避免原始数组数据的改变。
另外,数组克隆还可以用来创建一个与原始数组相同元素的数组,以避免在不同的方法中共享同一个数组对象。例如:
int[] originalArray = {1, 2, 3, 4, 5};
int[] newArray = originalArray.clone();
上面的代码将originalArray数组克隆到newArray数组中。由于newArray数组是一个新的对象,并且与originalArray数组具有相同的元素和大小,因此在不同的方法中共享newArray数组不会影响originalArray数组。
代码分析:
该代码定义了两个整型数组:originalArray和newArray。原始数组originalArray中包含了1到5这五个整数。然后使用clone()方法将原始数组复制到了新数组newArray中,这样新数组也包含了1到5这五个整数。这里需要注意的是,原始数组和新数组虽然会包含相同的元素,但是它们是不同的数组对象,它们在内存中的地址是不同的。因此,对于新数组的任何修改操作都不会影响到原始数组。
优缺点分析
数组拷贝
数组拷贝的优点是可以将一个数组中的元素复制到另一个数组中,使得所有操作都在新的数组上进行,不会影响原始数组。数组拷贝的缺点是需要手动指定源数组和目标数组的位置和元素个数,如果指定的参数有误,将会出现数组越界和数据覆盖等问题。
数组克隆
数组克隆的优点是可以创建一个与原始数组相同元素的新数组对象,以避免在不同的方法中共享同一个数组对象的问题。数组克隆的缺点是需要调用clone()方法,如果未正确重写这个方法,将会出现克隆出的新数组与原始数组不一致的问题。
类代码方法介绍
数组拷贝
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
数组克隆
public Object clone() throws CloneNotSupportedException
测试用例
我们可以编写一个简单的Java程序来测试数组拷贝和数组克隆的功能。
数组拷贝测试
测试代码演示
package com.example.javase.se.array;import java.util.Arrays;/*** @Author ms* @Date 2023-11-14 21:11*/
public class ArrCopyTest {public static void main(String[] args) {int[] srcArray = {1, 2, 3, 4, 5};int[] destArray = new int[5];System.arraycopy(srcArray, 0, destArray, 0, 5);System.out.println(Arrays.toString(destArray));}
}
上面的代码将srcArray数组中的所有元素复制到destArray数组中,并在控制台输出destArray数组中的元素。输出结果为{1, 2, 3, 4, 5}。
测试结果
根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

测试代码分析
根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。
这段代码演示了如何使用Java中的System.arraycopy()方法来复制一个数组。在这段代码中,首先定义了一个长度为5的int类型数组srcArray,同时定义了一个长度也为5的int类型数组destArray。接着使用System.arraycopy()方法复制srcArray数组到destArray数组中。
具体来说,System.arraycopy()方法的第一个参数是源数组,第二个参数是源数组中开始复制的位置,第三个参数是目标数组,第四个参数是目标数组中开始复制的位置,第五个参数是要复制的元素个数。所以这段代码中,从srcArray数组的第0个位置开始,复制5个元素到destArray数组中的第0个位置。
最后,使用Arrays.toString()方法将destArray数组转换为字符串并输出结果。在本例中,输出的结果为[1, 2, 3, 4, 5],表示destArray数组中的元素已经成功地从srcArray数组中复制过来了。
数组克隆测试
测试代码演示
package com.example.javase.se.array;import java.util.Arrays;/*** @Author ms* @Date 2023-11-14 21:11*/
public class ArrCloneTest {public static void main(String[] args) {int[] srcArray = {1, 2, 3, 4, 5};int[] destArray = srcArray.clone();System.out.println(Arrays.toString(destArray));}
}
上面的代码将srcArray数组克隆到destArray数组中,并在控制台输出destArray数组中的元素。输出结果为{1, 2, 3, 4, 5}。
测试结果
根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

测试代码分析
根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。
这段代码实现了对一个整型数组进行克隆的操作。首先定义了一个数组 srcArray,它包含了 5 个整型元素。然后使用 clone() 方法对 srcArray 进行克隆,得到了一个新的数组 destArray,其元素与 srcArray 完全相同。
最后,使用 Arrays.toString() 方法将 destArray 数组中的元素转换为字符串,并输出到控制台上,以便查看克隆是否成功。
整个程序运行起来,控制台输出的内容应该是:[1, 2, 3, 4, 5]。
全文小结
在本文中,我们介绍了Java中的数组概念,以及数组拷贝和数组克隆的含义和用法。我们通过源代码解析,应用场景案例和优缺点分析等方面对它们进行深入探讨。最后,我们给出了类代码方法介绍和测试用例,并进行了全文小结和总结。
总结
Java中的数组拷贝和数组克隆是比较基础的操作,在实际开发中也非常常见。熟练掌握它们的使用方法,有助于提高编程效率和代码质量。
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
相关文章:
一次搞定:Java中数组拷贝VS数组克隆
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…...
Java多线程编程与并发处理
引言 在现代编程中,多线程和并发处理是提高程序运行效率和资源利用率的重要方法。Java提供了丰富的多线程编程支持,包括线程的创建与生命周期管理、线程同步与锁机制、并发库和高级并发工具等。本文将详细介绍这些内容,并通过表格进行总结和…...
C++ 35 之 对象模型基础
#include <iostream> #include <string.h> using namespace std;class Students05{ public:// 只有非静态成员变量才算存储空间,其他都不算int s_a; // 非静态成员变量,算对象的存储空间double s_c;// 成员函数 不算对象的存储空间void f…...
PHP超级全局变量:功能、应用及最佳实践
PHP中的超级全局变量(Superglobal Variables)是预定义的数组,它们在脚本的全部作用域内都可以访问,无需使用global关键字。超级全局变量包含了关于请求、会话、服务器等各种信息,常见的有$_GET、$_POST、$_REQUEST、$_…...
python在windows创建的文件,换成linux系统格式
python在windows创建的文件,换成linux系统格式 dos2unix.exe的下载(下载的文件放入路径下:C:\Windows\System32) 链接:https://pan.baidu.com/s/10fC2tfvUtbh-axJ21cj_Xw?pwdm3zc 提取码:m3zc 批量修改文件格式 import subpr…...
最新区块链论文速读--CCF A会议 ICSE 2024 共13篇 附pdf下载 (2/2)
Conference:International Conference on Software Engineering (ICSE) CCF level:CCF A Categories:Software Engineering/System Software/Programming Languages Year:2024 Num:13 第1~7篇区块链文章请点击此处…...
C++ 34 之 单例模式
#include <iostream> #include <string.h> using namespace std;class King{// 公共的函数,为了让外部可以获取唯一的实例 public:// getInstance 获取单例 约定俗成static King* getInstance(){return true_king;}private: // 私有化// 构造函数设置为…...
SAP BW:传输转换源系统-源系统映射关系
最近有朋友再问问我源系统映射关系怎么配置,想着写一个怕以后忘了。 简单说下这个是干嘛的,其实就是配置一个源系统到目标系统的一个映射,这样传输的时候才知道传过来的数据源要变成目标系统的数据源。 比如下图,在开发环境&…...
React+TS前台项目实战(九)-- 全局常用组件弹窗Dialog封装
文章目录 前言Dialog公共弹窗组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局公共弹窗Dialog组件封装,将用到上篇封装的模态框Modal组件。有时在前台项目中,偶尔要用到一两个常用的组件,如 弹窗&#x…...
利用视觉分析技术提升水面漂浮物、水面垃圾检测效率
随着城市化进程的加速和工业化的发展,水体污染问题日益严重,水面漂浮物成为水环境治理的一大难题。传统的水面漂浮物检测方法主要依赖人工巡查和简单的传感器检测,存在着效率低、准确率不高等问题。为了提升水面漂浮物检测的效率和准确性&…...
NFT 智能合约实战-快速开始(1)NFT发展历史 | NFT合约标准(ERC-721、ERC-1155和ERC-998)介绍
文章目录 NFT 智能合约实战-快速开始(1)NFT发展历史国内NFT市场国内NFT合规性如何获得NFT?如何查询NFT信息?在 OpenSea 上查看我们的 NFT什么是ERC721NFT合约标准ERC-721、ERC-1155和ERC-998 对比ERC721IERC721.sol 接口内容关于合约需要接收 ERC721 资产 onERC721Received…...
Linux知识整理说明
最近学校Linux课程刚刚结课,但还是有其他课程在继续。 所以接下来我会抽时间,根据笔记以及网络资料,整理和Linux相关的知识文档,各位可以后续留意. 完整的章目录我会先发出来,后续补充完整。 所有的内容会在 下周三(6…...
诊所管理系统哪家会好一点
随着医疗行业的快速发展和信息化进程的加速,诊所作为医疗服务的重要基层单位,其运营管理效率与服务质量的提升愈发依赖于现代化的管理工具。诊所管理系统应运而生,旨在通过集成化、智能化的技术手段,帮助诊所实现诊疗流程优化、资…...
前端根据权限生成三级路由
三级菜单和后端返回数组对比获取有权限的路由 数组: //后端返回的数组 const arr1 [sale.management, sale.order, sale.detail]; //前端路由 const arr2 [{path: "/sale-manage",redirect: "/sale-manage/sale-order/sale-list",name: sale…...
Databricks超10亿美元收购Tabular;Zilliz 推出 Milvus Lite ; 腾讯云支持Redis 7.0
重要更新 1. Databricks超10亿美元收购Tabular,Databricks将增强 Delta Lake 和 Iceberg 社区合作,以实现 Lakehouse 底层格式的开放与兼容([1] [2])。 2. Zilliz 推出 Milvus Lite 轻量级向量数据库,支持本地运行;Milvus Lite 复…...
算法day29
第一题 695. 岛屿的最大面积 本题解法:采用bfs的算法; 本题使用象限数组的遍历方法和定义布尔数组vis来遍历每一个元素的上下左右元素,防治被遍历的元素被二次遍历; 本题具体分析如上题故事,但是由于要求区域的最大面…...
车牌识别(附源代码)
完整项目已上传至github:End-to-end-for-chinese-plate-recognition/License-plate-recognition at master duanshengliu/End-to-end-for-chinese-plate-recognition GitHub 整体思路: 1.利用u-net图像分割得到二值化图像 2.再使用cv2进行边缘检测获得车牌区域坐…...
在VSCode中安装python
引言 Python 是一种广泛使用的高级编程语言,因其易学、易用、强大而受到欢迎。它由 Guido van Rossum 于 1991 年首次发布,并以简洁的语法和丰富的库生态系统而著称。 以下是 Python 的一些关键特点和优势: 关键特点 易于学习和使用&#x…...
StarkNet架构之L1-L2消息传递机制
文章目录 StarkNet架构之L1-L2消息传递机制L2 → L1消息L2 → L1消息结构L2 → L1消息哈希L1 → L2消息L1 → L2消息取消L1 → L2报文费用L1 → L2哈希额外资源StarkNet架构之L1-L2消息传递机制 原文地址:https://docs.starknet.io/architecture-and-concepts/network-archit…...
19.2 HTTP客户端-定制HTTP请求、调试HTTP、响应超时
1. 定制HTTP请求 如果需要对向服务器发送的HTTP请求做更多超越于默认设置的定制化。 client : http.Client{} 使用net/http包提供的导出类型Client,创建一个表示客户端的变量。request, err : http.NewRequest("GET", "https://ifconfig.io/ip&quo…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
