当前位置: 首页 > news >正文

一次搞定: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 个参数:

  1. src:源数组对象;
  2. srcPos:源数组中的起始位置(从 0 开始计数);
  3. dest:目标数组对象;
  4. destPos:目标数组中的起始位置(从 0 开始计数);
  5. 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:// 只有非静态成员变量才算存储空间&#xff0c;其他都不算int s_a; // 非静态成员变量&#xff0c;算对象的存储空间double s_c;// 成员函数 不算对象的存储空间void f…...

PHP超级全局变量:功能、应用及最佳实践

PHP中的超级全局变量&#xff08;Superglobal Variables&#xff09;是预定义的数组&#xff0c;它们在脚本的全部作用域内都可以访问&#xff0c;无需使用global关键字。超级全局变量包含了关于请求、会话、服务器等各种信息&#xff0c;常见的有$_GET、$_POST、$_REQUEST、$_…...

python在windows创建的文件,换成linux系统格式

python在windows创建的文件,换成linux系统格式 dos2unix.exe的下载&#xff08;下载的文件放入路径下:C:\Windows\System32&#xff09; 链接&#xff1a;https://pan.baidu.com/s/10fC2tfvUtbh-axJ21cj_Xw?pwdm3zc 提取码&#xff1a;m3zc 批量修改文件格式 import subpr…...

最新区块链论文速读--CCF A会议 ICSE 2024 共13篇 附pdf下载 (2/2)

Conference&#xff1a;International Conference on Software Engineering (ICSE) CCF level&#xff1a;CCF A Categories&#xff1a;Software Engineering/System Software/Programming Languages Year&#xff1a;2024 Num&#xff1a;13 第1~7篇区块链文章请点击此处…...

C++ 34 之 单例模式

#include <iostream> #include <string.h> using namespace std;class King{// 公共的函数&#xff0c;为了让外部可以获取唯一的实例 public:// getInstance 获取单例 约定俗成static King* getInstance(){return true_king;}private: // 私有化// 构造函数设置为…...

SAP BW:传输转换源系统-源系统映射关系

最近有朋友再问问我源系统映射关系怎么配置&#xff0c;想着写一个怕以后忘了。 简单说下这个是干嘛的&#xff0c;其实就是配置一个源系统到目标系统的一个映射&#xff0c;这样传输的时候才知道传过来的数据源要变成目标系统的数据源。 比如下图&#xff0c;在开发环境&…...

React+TS前台项目实战(九)-- 全局常用组件弹窗Dialog封装

文章目录 前言Dialog公共弹窗组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局公共弹窗Dialog组件封装&#xff0c;将用到上篇封装的模态框Modal组件。有时在前台项目中&#xff0c;偶尔要用到一两个常用的组件&#xff0c;如 弹窗&#x…...

利用视觉分析技术提升水面漂浮物、水面垃圾检测效率

随着城市化进程的加速和工业化的发展&#xff0c;水体污染问题日益严重&#xff0c;水面漂浮物成为水环境治理的一大难题。传统的水面漂浮物检测方法主要依赖人工巡查和简单的传感器检测&#xff0c;存在着效率低、准确率不高等问题。为了提升水面漂浮物检测的效率和准确性&…...

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课程刚刚结课&#xff0c;但还是有其他课程在继续。 所以接下来我会抽时间&#xff0c;根据笔记以及网络资料&#xff0c;整理和Linux相关的知识文档&#xff0c;各位可以后续留意. 完整的章目录我会先发出来&#xff0c;后续补充完整。 所有的内容会在 下周三(6…...

诊所管理系统哪家会好一点

随着医疗行业的快速发展和信息化进程的加速&#xff0c;诊所作为医疗服务的重要基层单位&#xff0c;其运营管理效率与服务质量的提升愈发依赖于现代化的管理工具。诊所管理系统应运而生&#xff0c;旨在通过集成化、智能化的技术手段&#xff0c;帮助诊所实现诊疗流程优化、资…...

前端根据权限生成三级路由

三级菜单和后端返回数组对比获取有权限的路由 数组&#xff1a; //后端返回的数组 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&#xff0c;Databricks将增强 Delta Lake 和 Iceberg 社区合作&#xff0c;以实现 Lakehouse 底层格式的开放与兼容([1] [2])。 2. Zilliz 推出 Milvus Lite 轻量级向量数据库&#xff0c;支持本地运行&#xff1b;Milvus Lite 复…...

算法day29

第一题 695. 岛屿的最大面积 本题解法&#xff1a;采用bfs的算法&#xff1b; 本题使用象限数组的遍历方法和定义布尔数组vis来遍历每一个元素的上下左右元素&#xff0c;防治被遍历的元素被二次遍历&#xff1b; 本题具体分析如上题故事&#xff0c;但是由于要求区域的最大面…...

车牌识别(附源代码)

完整项目已上传至github:End-to-end-for-chinese-plate-recognition/License-plate-recognition at master duanshengliu/End-to-end-for-chinese-plate-recognition GitHub 整体思路&#xff1a; 1.利用u-net图像分割得到二值化图像 2.再使用cv2进行边缘检测获得车牌区域坐…...

在VSCode中安装python

引言 Python 是一种广泛使用的高级编程语言&#xff0c;因其易学、易用、强大而受到欢迎。它由 Guido van Rossum 于 1991 年首次发布&#xff0c;并以简洁的语法和丰富的库生态系统而著称。 以下是 Python 的一些关键特点和优势&#xff1a; 关键特点 易于学习和使用&#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&#xff0c;创建一个表示客户端的变量。request, err : http.NewRequest("GET", "https://ifconfig.io/ip&quo…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...