一次搞定: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…...
KafkaQ - 好用的 Kafka Linux 命令行可视化工具
软件效果前瞻 ~ 鉴于并没有在网上找到比较好的linux平台的kafka可视化工具,今天为大家介绍一下自己开发的在 Linux 平台上使用的可视化工具KafkaQ 虽然简陋,主要可以实现下面的这些功能: 1)查看当前topic的分片数量和副本数量 …...
不愧是字节,图像算法面试真细致
这本面试宝典是一份专为大四、研三春招和研二暑假实习生准备的珍贵资料。 涵盖了图像算法领域的核心知识和常见面试题,包括卷积神经网络、实例分割算法、目标检测、图像处理等多个方面。不论你是初学者还是有经验的老手,都能从中找到实用的内容。 通过…...
14、C++中代码重用
1、C模板的主要作用是允许编写通用代码,即能够在不同数据类型或数据结构上工作而无需重复编写代码。通过模板,可以实现代码的复用性和灵活性,从而提高开发效率和程序的可维护性。 typename关键字: 在C中,typename关键…...
剖析框架代码结构的系统方法(下)
当面对Dubbo、Spring Cloud、Mybatis等开源框架时,我们可以采用一定的系统性的方法来快速把握它们的代码结构。这些系统方法包括对架构演进过程、核心执行流程、基础架构组成和可扩展性设计等维度的讨论。 在上一讲中,我们已经讨论了架构演进过程和核心执行流程这两个系统方法…...
C语言学习笔记之结构体(一)
目录 什么是结构体? 结构体的声明 结构体变量的定义和初始化 结构体成员的访问 结构体传参 什么是结构体? 在现实生活中的很多事物无法用单一类型的变量就能描述清楚,如:描述一个学生,需要姓名,年龄&a…...
MATLAB入门知识
目录 原教程链接:数学建模清风老师《MATLAB教程新手入门篇》https://www.bilibili.com/video/BV1dN4y1Q7Kt/ 前言 历史记录 脚本文件(.m) Matlab帮助系统 注释 ans pi inf无穷大 -inf负无穷大 i j虚数单位 eps浮点相对精度 0/&a…...
计算机网络(5) ARP协议
什么是ARP 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定…...
美团的 AI 面试有点简单
刷到一个美团的 AI 实习生的面试帖子,帖子虽然不长,但是把美团 AI 评测算法实习生面试的问题都po出来了。 单纯的看帖子中面试官提出的问题,并不是很难,大部分集中在考察AI项目和对AI模型的理解上,并没有过多的考察AI算…...
编程软件怎么给机器人编程:深入探索编程与机器人技术的融合
编程软件怎么给机器人编程:深入探索编程与机器人技术的融合 随着科技的飞速发展,机器人技术已经深入到我们生活的方方面面。而要让机器人按照我们的意愿执行任务,就需要借助编程软件对机器人进行编程。那么,编程软件究竟是如何给…...
unity2d Ugui--Image城市道路汽车行驶
目录 1.车辆生成与回收 2.路径点控制 3.车辆控制 1.车辆生成与回收 using System.Collections.Generic; using UnityEngine;public class RoadContr : MonoBehaviour {public WayPoint[] wayPoints; //出生点public Transform pare;[SerializeField]private Car[] fabCar;pu…...
网站移动字幕要怎么做/绍兴seo排名外包
Docker Hub目前Docker官方维护了一个公共仓库Docker Hub,其中已经包括了数量超过15000个镜像。大部分需求都可以通过在Docker Hub中直接下载镜像来使用。注册登录可以在https://hub.docker.com 免费注册一个Docker账号。在命令行执行docker login输入用户名及密码来…...
网站在互联网营销中的作用/河南最近的热搜事件
精彩内容EfficientDet-d6在52M参数和229BFLOPs的情况下,实现了map在COCO数据集的最高水平(50.9),比之前最好的检测器更小,使用更少的FLOPs (13xless FLOPs),但仍然更准确(0.2% mAP)。传送门:https://github.com/google/automl/tre…...
免费做淘宝客网站/今日头条网页版
Oracle数据库中的case函数和decode函数 1、case函数 case函数有两种格式: (1)格式一 CASE exp1WHEN exp11 THEN exp12WHEN exp21 THEN exp22....WHEN expN1 THEN expN2ESLE expM END说明: 该函数的返回值为:当exp1…...
邢台做网站的/seo方式包括
一.事件绑定 1.事件绑定函数 事件的绑定函数为如下形式: .bind(type [,data],fn)type:类型 如click.....data:参数fn:事件执行的函数 例子 $(function(){ $(#id1).click(function(){ $(#id2).show();//id2显示 }) ; }); 二.合成事件 1.鼠标滑过事件 .hover(ente…...
新开传奇发布网站/个人网站推广方法
Dreamweaver(简称DW)的设计视图里不能显示struts标签,只能手动改代码。为此我找了好久,终于还是在DW网站上找到了,只有8K大,虽然没有漂亮的图标,但显示的信息还是很够用的。现在总算可以用DW编辑…...
wordpress做商城网站吗/口碑营销的概念
一是存储以后要使用的但是以前算过的值 二是后面的和前面的存在递推关系...