java数组拷贝

news/2025/3/26 13:09:02/文章来源:https://www.cnblogs.com/bravecap/p/18789787

在 Java 中,数组拷贝有多种方法,每种方法适用于不同的场景。以下是常见的数组拷贝方式及示例:


1. 使用 for 循环手动拷贝

特点:简单直接,适合小数组或需要自定义操作的场景。

int[] src = {1, 2, 3, 4, 5};
int[] dest = new int[src.length];for (int i = 0; i < src.length; i++) {dest[i] = src[i];
}

2. 使用 System.arraycopy()

特点:高效(底层是 Native 方法),适合任意类型的数组。

int[] src = {1, 2, 3, 4, 5};
int[] dest = new int[src.length];// 参数:源数组, 源起始位置, 目标数组, 目标起始位置, 拷贝长度
System.arraycopy(src, 0, dest, 0, src.length);

3. 使用 Arrays.copyOf()

特点:简洁,适合拷贝整个数组或扩展数组长度。

import java.util.Arrays;int[] src = {1, 2, 3, 4, 5};
int[] dest = Arrays.copyOf(src, src.length); // 拷贝整个数组
int[] partialCopy = Arrays.copyOf(src, 3);   // 拷贝前3个元素

4. 使用 Arrays.copyOfRange()

特点:拷贝数组的指定范围。

import java.util.Arrays;int[] src = {1, 2, 3, 4, 5};
int[] dest = Arrays.copyOfRange(src, 1, 4); // 拷贝索引1到3的元素(左闭右开)
// 结果:{2, 3, 4}

5. 使用 clone() 方法

特点:直接调用数组对象的 clone() 方法,简洁但可能引发深浅拷贝问题。

int[] src = {1, 2, 3, 4, 5};
int[] dest = src.clone(); // 浅拷贝

浅拷贝 vs 深拷贝

  • 浅拷贝:上述方法均为浅拷贝。如果数组元素是对象,拷贝后的数组和原数组引用同一对象。

    class Person { String name; }Person[] src = {new Person("Alice"), new Person("Bob")};
    Person[] dest = Arrays.copyOf(src, src.length);// 修改 dest[0] 会影响 src[0]
    dest[0].name = "Charlie";
    System.out.println(src[0].name); // 输出 "Charlie"
    
  • 深拷贝:需要手动复制对象或使用序列化。

    // 示例:手动深拷贝
    Person[] dest = new Person[src.length];
    for (int i = 0; i < src.length; i++) {dest[i] = new Person(src[i].name);
    }
    

性能比较

  • 最快System.arraycopy()(底层优化)。
  • 最灵活Arrays.copyOf()Arrays.copyOfRange()(内部调用 System.arraycopy)。
  • 最直观for 循环(适合简单逻辑)。

注意事项

  1. 目标数组长度必须足够,否则抛出 ArrayIndexOutOfBoundsException
  2. 多维数组(如 int[][])的拷贝需要逐层处理(如遍历每一行拷贝)。

根据具体需求选择合适的方法!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/904867.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

L1.1 技术和产品准备度

L1.1 技术和产品准备度 技术和产品准备度 技术与产品的演进 ​ 上面这张图展示了如何在技术尚未完全成熟时,启动产品开发,以及技术如何随着新需求或洞察逐步演进,并支持产品的更新换代。产品1.0:由先前研发的的技术3支撑,加上“产品开发可以在预期的技术开发成果的基础上提…

从故障响应到客户信赖:华为ITR流程的五大核心步骤与实战案例

华为究竟是如何在与西方巨头的激烈竞争中崭露头角、脱颖而出的呢?答案是:凭借卓越的服务。今天我们来探讨一下华为是如何通过卓越的服务赢得全球市场的。 一、华为的三件大事 华为前高管费敏曾经总结过,华为的业务可以分成三件大事:1. 开发产品:这就是 IPD 流程,负责从有…

提升生产效率的关键: ethercat转TCPIP智能通信

大家好。最近在数据互联互通方面,我们迎来了一个重要的突破。作为生产管理系统的核心组成部分,数据互联互通一直是一个亟待解决的挑战。我们知道,EtherCAT和TCP/IP是两种不同的通信协议,它们之间的互通性一直存在问题。不过,现在有一款新产品值得关注,这款产品能够实现Et…

Trae初体验

Trae(国际版)的Ai搭载Claude-3.7-Sonnet(完全免费且速度很快)和DeepSeek-R1以及V3(不存在服务器繁忙)以及GPT-4o Trae国服的Ai搭载DouBao和DeepSeek。用Claude-3.7-Sonnet 写一个简易的贪吃蛇小游戏:这个贪吃蛇游戏包含以下功能:使用方向键控制蛇的移动 吃到食物会增加长度和…

C# 从零开始使用Layui.Wpf库开发WPF客户端

一、简介最近需要开发一个桌面版的工具软件,之前用得更多的是Winform,作为一个全干工程师,我们也要兼顾下WPF,趁此机会再研究下开源控件库。MaQaQ:Winform真好用(有个HZHControls控件库,值得一看)。 二、准备工作找了下开源控件库,诸如MaterialDesignInXAML、HandyCon…

聚点和闭包中点的等价条件

聚点有以下等价描述: 闭包中点有以下等价描述:这些等价描述在与导集和闭包的证明中能起到很大的作用。下面是一个例子。

Itext5生成高质量、易识别、适合小尺寸标签打印的二维码

高质量、易识别、小尺寸二维码生成 1.增大二维码的原始尺寸(例如 1000 x 1000 或更大),再缩放为 PDF 所需的大小。这样可以保留更多像素细节,提高识别率。 2.降低容错级别到 L 或 M,如果你的内容不是特别长或复杂的话,这样能减少密集度。 3.优化缩放方式: • 使用 Buffe…

【Docker】安装部署jenkins

docker安装部署jenkinsdocker安装jenkins  1、下载jenkins  2、创建挂载目录  3、启动jenkins容器  4、验证jenkins是否启动成功  5、获取管理员密码  6、下载安装插件 docker安装jenkins【1】下载jenkins拉取jenkins镜像 docker pull jenkins/jenkins:2.426.2-lts…

焊接保护气体智能调节控制器|节气装置

机器人焊接节气装置在焊接流程中扮演着至关重要的角色,它犹如一道坚实的屏障,为熔融金属营造一个纯净的焊接环境,有效抵御空气中氧气、氮气、水蒸气等不良因素的侵扰。具体而言,保护气体的多重功效可详尽阐述为以下几个层面:对焊缝的精心呵护。在诸如氩弧焊等精密焊接工艺…

线段树+扫描线,解决“静态矩阵加和+矩阵查询”问题

在试图用 CDQ 分治做这道题的时候遇到了一些麻烦,修改全部在查询之前的静态部分不会做,题解虽然还算详细,但是本人蒟蒻仍然无法理解,思考一上午,尝试过各种证明方法后,大致证明题解算法的正确性,记录在这里。先看题解的说法和代码:使用扫描线、线段树和差分离线解决静态…

centOS 上部署hadoop+mysql+hive 服务之mysql 和hive安装

hive默认存放元数据的数据库是Derby数据库,Derby数据库是嵌入式数据库,它只能单用户访问,也就是只能有一个会话连接到元数据存储,不适合多用户连接操作需求。比如,多用户同时进行查询或并发操作时,Derby无法处理,这会导致性能瓶颈或直接报错。因此,建议替换为用mysql在…