《Java 100 天进阶之路》第4篇:秒懂数组拷贝,感知新境界

Java 数组复制:从浅拷贝到深拷贝的全面指南 在 Java 编程中,数组复制是一项基础但至关重要的操作。无论是为了备份数据、传递副本以避免修改原数组,还是在多线程环境下共享数据,掌握正确的数组复制方法都至关重要。本文将深入探讨 Java 中数组复制的各种方法,分析其原理、性能差异及适用场景,帮助您在实际开发中做出最佳选择。等基本类型数组,所有复制方法本质上都是深拷贝。:代码冗长,需要手动处理边界。:需要复制数组的连续子序列时。:简单直观,适用于所有情况。对于引用类型数组(如。 阅读详情

第4篇:秒懂数组拷贝,感知新境界

📌 系列导航:《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第3篇:为何要配置环境变量? |
➡️ 下一篇:第5篇:装箱和拆箱

一、核心知识点

  • 数组拷贝的传统方式(循环赋值)及其低效问题
  • System.arraycopy() 底层性能优势(JVM底层C/C++实现)
  • Arrays.copyOf() 便捷用法
  • 浅拷贝机制:引用复制 vs 对象新建
  • 深拷贝的简单实现

二、通俗讲解(1分钟开心学)

1. 什么是数组拷贝?

假设你有一个装着5个球的箱子A(数组),你想把球全部复制到一个新箱子B(另一个数组)里。这就是数组拷贝。

2. 新手做法(循环逐个搬运)

for (int i = 0; i < src.length; i++) {
    dest[i] = src[i];
}

没什么大问题,但如果箱子巨大(比如100万个球),每次搬一个,效率就低了。

3. 高手做法(直接撬动整排货架)

System.arraycopy() 是JVM底层用C/C++实现的,可以直接从内存中批量复制,就像用叉车一次性搬走整排货架,比手工搬快得多。

4. 浅拷贝是什么?

如果数组里放的不是基本类型(如int),而是对象(比如Person),那么拷贝的结果是:新数组里的元素和原数组里的元素指向内存中的同一批对象。你通过新数组修改了对象的属性,原数组对应对象的属性也会变。

生活类比:
你有一张同学录(原数组),上面写着张三家的地址。你复印了一份同学录(新数组),两份同学录上写的是同一个地址。你通过新同学录去张三家里涂鸦,原同学录上对应的张三也会被涂鸦覆盖。

三、实操代码案例 + 场景说明

场景:你需要将一个数组的部分元素复制到另一个数组的指定位置,例如在游戏开发中动态合并怪物列表。

1. 使用System.arraycopy()

// 源数组
int[] src = {10, 20, 30, 40, 50};
// 目标数组,长度比源数组大一点
int[] dest = new int[10];

// 参数:源数组,源起始索引,目标数组,目标起始索引,复制长度
System.arraycopy(src, 1, dest, 2, 3);

// dest变成: [0, 0, 20, 30, 40, 0, 0, 0, 0, 0]

2. 使用Arrays.copyOf()(更简洁)

int[] src = {1,2,3};
int[] newArr = Arrays.copyOf(src, 5);  // 新数组长度5,多余元素补0
// newArr = [1,2,3,0,0]

3. 浅拷贝演示(引用类型数组)

class Person { String name; Person(String n) { name = n; } }

Person[] original = { new Person("张三"), new Person("李四") };
Person[] copy = Arrays.copyOf(original, original.length);

copy[0].name = "王五";
System.out.println(original[0].name); // 输出"王五" —— 原数组也被改了!

四、避坑要点

错误/误区后果正确做法
使用循环逐个拷贝对象数组后,以为修改副本不影响原数组意外修改了原对象理解浅拷贝,需要深拷贝时手动new新对象
System.arraycopy 源范围超出边界IndexOutOfBoundsException确保源起始+长度 ≤ 源长度;目标起始+长度 ≤ 目标长度
认为Arrays.copyOf()能自动深拷贝同上,还是浅拷贝内存地址复制,不是对象复制
直接 int[] copy = original两个引用指向同一个数组,修改一个两个都变使用copyOf或arraycopy创建新数组

五、面试高频考点

Q1:System.arraycopy() 和 Arrays.copyOf() 有什么区别?

System.arraycopy() 需要提前创建好目标数组,可以指定起始位置;Arrays.copyOf() 内部自动创建新数组(最终也调用了arraycopy),代码更简洁但灵活性稍弱。

Q2:什么是浅拷贝?什么情况下会出问题?

浅拷贝只复制对象的引用(地址),不复制对象本身。当通过副本修改对象内部状态时,原数组也会受影响。需要深拷贝时应遍历数组并逐个new新对象或使用序列化。

Q3:如何实现一维对象数组的深拷贝?

简单方法:遍历原数组,对每个元素调用clone()(如果对象实现了Cloneable)或手动new。更通用的方法:使用序列化(实现Serializable)后反序列化。

六、练习题

  1. 代码填空:System.arraycopy(______, 0, ______, 0, 3); 将源数组前3个元素复制到目标数组的前3个位置。
  2. 简答:浅拷贝在实际项目中可能导致什么bug?举例说明。
  3. 动手:写一个工具方法 public static <T> T[] deepCopy(T[] original),实现通用深拷贝(提示:利用序列化或new实例)。

📊 你的学习进度

  • 当前:第4篇 / 共44篇 · 第一阶段:Java基础语法与环境
  • ✅ 已完成:第1~3篇
  • 📖 正在学:第4篇
  • ⏳ 待学习:第5~44篇

👉 📚 完整目录 & 学习指南 | 🔥 订阅本专栏,不错过每一篇

💡 本专栏每篇都包含:避坑表 + 面试高频考点 + 练习题。每天30分钟,100天拿offer!


👉 下一篇文章预告

《装箱和拆箱》

内容简介:int 和 Integer 有什么区别?为什么 Integer 比较要用 equals?缓存池陷阱是怎么回事?

💡 学完这篇,你将彻底搞懂自动装箱拆箱的底层原理,面试再也不会被“128 == 128”绕晕。

📌 《Java 100 天进阶之路 | 从入门到上岗就业》 每天一篇,建议收藏 + 关注,一起100天拿offer!
👉 点击关注我,更新后第一时间收到推送!

Java数组篇[7]:数组拷贝 在Java程序设计中,经常需要复制数组或创建数组的克隆。这在修改数组内容时保留原始数据不变,或者在多线程环境中避免数据竞争时非常有用。本文将探讨Java中数组拷贝和克隆的不同方法,包括手动拷贝、使用方法、以及数组的克隆。数组拷贝是创建数组内容的一个副本,而克隆则是创建数组对象的一个完整副本。在Java中,数组是引用类型,所以简单的赋值操作只会复制引用,而不是数组对象本身。clone():数组的clone()方法返回数组的一个副本。数组的拷贝和克隆是Java编程中常见的操作。 阅读详情

相关推荐

劳特巴赫 Trace32 调试使用教程

详细介绍如何使用trace32进行调试

m0_56208280的博客 4万+

《2026全新 | Java 100 天进阶之路:从零基础到上岗就业,108篇完整学习地图》

摘要:不背八股文,不堆概念。44篇基础 + 64篇进阶(共108篇),100天助你达到Java就业水平,从容面对技术面试。 👉 零基础入门 / 校招社招突击 / 1-3年Java后端提升 / 想系统复盘全栈知识的开发者。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 9583

World Creator地形导入UE

导出预设选择高度图(heigh map)格式选择PNG 16位,或者RAW 16位,需要反转y轴(与虚幻不同),命名格式会自动带一个× , 将×改成_ 或者删掉自己命名 (虚幻名称不支持x符号)导入虚幻 , 修改Z轴 , 就是用 地形最高 - 地形最低 , 然后除以512 , 再乘以100。把这个数字填入Z轴缩放 , 点击生成即可。

UE星空 2140

《Java 100 天进阶之路》第31篇:Java数组详解

本文详细讲解了Java数组的核心知识点,包括数组定义、初始化方式、遍历方法、内存结构以及多维数组的实现。通过生活类比帮助理解数组特性,并提供了完整的代码示例演示一维和二维数组的操作。文章还总结了常见错误及解决方法,列举了面试高频问题,最后给出练习题巩固学习。适合Java初学者系统掌握数组相关知识。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 521

RDMA网络通信技术、NCCL集合通讯(GPU)

NCCL 是 NVIDIA 专为 GPU 设计的高性能集合通信库,用于优化多 GPU、多节点间的集体操作(如 AllReduce、Broadcast、AllGather 等),是深度学习分布式训练的核心组件。RDMA 允许计算机直接访问远程内存,无需 CPU 干预,大幅降低了网络通信的延迟和 CPU 开销。常见的 RDMA 实现包括。是两项关键技术,用于优化节点间数据传输效率和大规模并行计算性能。在高性能计算(HPC)、人工智能训练和数据密集型场景中,

weixin_42795092的博客 2413

一文吃透 SAP IDoc 状态码:从 TEDS1 到 WE02 排障,再到 ABAP 自动化监控

在 SAP 集成场景里,IDoc 往往是最常见、也最容易被低估的一条生命线:采购订单、发票、主数据、库存移动……只要系统之间要稳定地交换结构化业务数据,IDoc 就经常登场。真正让人头疼的,并不是 IDoc 本身,而是它在链路里到底走到了哪一步、卡在了哪里、该找谁背锅。这篇文章把常用的 IDoc 状态码按出站、入站拆开讲清楚,并且把每个状态对应的真实世界故障现象、排查入口、以及可以落地的 ABAP 监控代码串起来,让你看到状态码就能想到动作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 397

《Java 100 天进阶之路》第4.1篇:Java基础语法易混淆概念对比集(2026版)

摘要:基础篇外挂第一弹!面试官最爱问“A和B有什么区别”,本文汇总 12 组 Java 基础语法高频易混淆概念:JDK vs JRE vs JVM、基本类型 vs 引用类型、== vs equals()、& vs &&、break vs continue vs return、print vs println vs printf、next() vs nextLine()、++i vs i++、switch 支持类型(含不支持 long/float/double/boolean 陷阱)、数组拷贝方式对比、浅拷贝

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 311

使用Qt Creator自带的Qt Designer构造UI界面流程总结

在本文中,我们将总结使用Qt Creator自带的Qt Designer构造UI界面的流程。在对话框中,您可以选择一个控件的信号,然后将其连接到另一个控件的槽。例如,您可以将按钮的点击信号连接到一个槽函数,以响应按钮的点击事件。右键单击窗口设计器中的空白区域,选择适当的布局管理器,如水平布局、垂直布局或网格布局。在Qt Designer中,您可以使用各种预定义的UI控件来设计应用程序的界面。现在,您可以在应用程序的源代码中使用生成的UI界面。在您的源文件中,包含相应的头文件,然后创建一个UI界面的实例。

cl6789的博客 1388

JAVA数组的四种拷贝方式

文章目录深拷贝与浅拷贝的区别1. for循环进行拷贝拷贝数值类型拷贝引用类型2. copyof / copyOfRange拷贝数值类型拷贝引用类型3. arraycopy拷贝数值类型拷贝引用类型4. clone拷贝数值类型拷贝引用类型5. 总结 深拷贝与浅拷贝的区别 假设现在有原数组A以及拷贝后的数组B,若是改变A中的某一个值,B数组随之相应的发生变化的拷贝方式称为浅拷贝,反之B数组不受影响,则称为深拷贝; 简单总结一下两者的概念: 深拷贝:拷贝后,修改原数组,不会影响到新数组; 浅拷贝:拷贝后,修改原数

Emperor10的博客 1048

无人机视角下基于YOLOv5/v8/v10的车辆检测系统:从算法原理到UI界面实战

随着无人机技术的普及和智慧城市的发展,无人机视角下的车辆检测在交通监控、战场侦察、灾害救援等领域展现出巨大的应用价值。然而,无人机航拍图像存在目标尺度小、视角多变、背景复杂等挑战。本文深入探讨了如何利用YOLOv5、YOLOv8、YOLOv10三个代表性目标检测算法,构建一套完整的无人机车辆检测系统。文章不仅详细解析了各版本YOLO的核心技术演进,还提供了从数据集准备、模型训练、性能评估到基于PyQt5/PySide6的图形界面开发的完整代码实现。通过本文,读者将能够掌握构建无人机实时车辆检测系统的全流程技

YOLO 169

【YOLO系列】YOLOv8详解:模型结构、损失函数、训练方法及代码实现

YOLOv8是Ultralytics团队2023年推出的高效目标检测框架,在速度与精度平衡、多任务支持和易用性方面实现突破。模型采用改进的CSPDarknet主干网络、C2f模块和SPPF加速结构,结合PAN-FPN特征融合和解耦检测头设计,支持目标检测、实例分割和关键点检测任务。创新性地使用CIoU定位损失、Focal Loss置信度损失和动态样本分配策略,显著提升检测性能。实验表明,YOLOv8较前代模型mAP提升5-10%,在TensorRT加速下可达1000FPS,提供5种尺寸灵活选择,成为实时目标

一碗白开水一 2775

《Java 100 天进阶之路》第3篇:为何要配置环境变量?

本文讲解了Java环境变量的核心概念与配置要点。环境变量是操作系统的全局键值对,其中Path变量决定了命令的搜索路径。不配置环境变量会导致每次执行Java命令都需要切换到JDK的bin目录。文章通过生活类比解释了Path的工作原理,并提供了常见问题的排查方法,包括验证配置、调整路径顺序等。还总结了避坑要点和面试高频考点,如Path的工作原理、临时修改环境变量的方法等。最后给出了练习题,帮助读者巩固知识。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 703

本文将详细介绍如何在 Qt (C++) 应用程序中集成 osgEarth,加载三维数字地球,并在指定经纬度添加三维模型(如飞机、建筑等)。

OSG 与 Qt 的交互通常需要处理 OpenGL 上下文。osgEarth 3.x 提供了对 Qt 的较好支持,或者可以使用。在普通 OSG 程序中,你需要手动处理坐标系转换将经纬度转为笛卡尔坐标 (XYZ)。这是实现的关键,将 OSG 的渲染循环集成到 Qt 的事件循环中。第三方库,但在本教程中,我们将展示一种通过继承。,将 Qt 的输入事件转换为 OSG 理解的。事件,这是实现交互(旋转地球、缩放)的基础。来嵌入 OSG 视图的标准方法。在这里我们初始化地球并添加模型。节点简化了这一过程。

qq_45859163的博客 1025

详解Java数组的四种拷贝方式

拷贝方式数值类型引用类型推荐使用for循环深拷贝浅拷贝copyof深拷贝浅拷贝√arraycopy深拷贝浅拷贝√clone深拷贝浅拷贝由于arraycopy底层是C++写的,所以速度快,更多的是使用这个方法。注意:本文中所有的引用数据类型都是以类的对象为例,使用的是对象数组,我们也知道引用类型包括类,接口,字符串等等。

glenshappy的专栏 1737

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

《Java 100 天进阶之路》第5篇:装箱和拆箱

本文介绍了Java中的装箱和拆箱机制。主要内容包括:基本类型与包装类的区别、手动/自动装箱拆箱的实现方式、Integer缓存池的特性(-128~127范围)、性能优化建议以及常见面试考点。文章通过生活类比和代码示例,解释了为什么需要包装类、自动装箱拆箱的原理,并重点提醒了缓存池陷阱和null值风险。最后提供了练习题和下一篇文章预告,帮助读者巩固知识点。全文以通俗易懂的方式讲解Java包装类的核心概念和使用注意事项。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 575

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

21天学会Java之(Java SE第八篇):数组、冒泡排序法、二分法查找

数组 数组的定义 数组是相同类型数据的有序集合,数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。数组的三个基本特点: 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。 其元素必须是相同类型,不允许出现混合类型。 数组类型可以是任何数据类型,包括基本类型和引用类型。 注意事项: 数组变量属引用类...

小志Coding笔记 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

100天精通Java (基础篇) —数组【Java第一个分水岭】

一、为什么需要数组 数组:多个内存变量元素,共同使用一个变量名称,并用下标加以区分。 二、数组介绍 数组可以存放多个同一类型的数据,数组也是一种数据类型,是引用类型。 三、数组快速入门 跟着思路看(超级简单) package com; public class Array01 { public static void main(String[] args) { //定义一个数组 double[] hens = {2,2,3,4,5,6,34,12,34

weixin_49667274的博客 1228

《Java 100 天进阶之路》第16篇:禁止使用Lombok

本文介绍Lombok通过注解自动生成Java样板代码(如getter/setter),虽提升开发效率,但存在严重隐患:继承场景下@EqualsAndHashCode默认忽略父类字段导致逻辑错误,@ToString可能引发循环引用栈溢出,且依赖IDE插件、降低代码可读性。企业开发中建议采用IDE代码生成、Java 16+的record类或手动编写替代。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 759

Java中的数组拷贝(复制)方法

初始化要求需要手动初始化目标数组其他方法自动创建新数组性能排序≈clone()≈> 手动循环功能特性需要部分拷贝:优先选或需要扩容:使用简单完整拷贝:推荐clone()或灵活拷贝→快速完整拷贝→或clone()范围拷贝→特殊需求→ 手动循环理解不同方法的底层实现和适用场景,是写出高质量Java代码的关键!

m0_67793801的博客 1274

关于java数组拷贝的性能

java 提供的System.arrayCopy()方法比自己写的数组copy要快.查看其源代码:public static native void arraycopy(Object src,  int  srcPos,                                        Object dest, int destPos,             

luoyahu的窝 2万+

java中关于数组拷贝的小知识

java中关于数组拷贝的小知识 普通的赋值拷贝: 一个数组变量拷贝给另一个数组变量。这时,两个变量将引用同一个数组,改变其中一个数组引用的数组值,那另外一个数组引用对应的数组值也会改变。如下: int[] a = new int[10]; a = new int[]{1,2,3,4,5,6}; int[] b = new int[a.length]; b = a; b[0] = 100; System.out.println(Arrays.toString(a));//[100, 2, 3, 4, 5,

wdyliuxingfeiyang的博客 196

java之数组篇*

java之数组篇*

2301_80174936的博客 2294

java数组拷贝函数System.arraycopy

数组:相同类型的数据,在内存中连续存储。 数组的声明: int [] a ; //栈中定义了int类型数组的引用 A [] aa ; //定义了A类型数组的应用 数组的初始化: int [] a = {1,2,3,4,5}; //定义时初始化 A [] a = new A[3]; //对象数组定义初始化, 内部初始化全为null A []a = { new A(1,2), new A(3,4), ...

c4679281314的博客 1562

Java数组进阶核心考点:边界、拷贝、排序与二维数组

数组是Java编程最基础的数据结构,但真正掌握其进阶用法并不简单。理解数组的内存模型、下标边界和默认值是避免运行时异常的前提。数组作为引用类型,复制时需区分浅拷贝与深拷贝,System.arraycopy和Arrays.copyOf是高效操作的核心工具。排序与二分查找依赖有序数组,Arrays.sort与binarySearch的细节决定了算法正确性。二维数组本质是数组的数组,支持不规则结构,矩阵转置、螺旋遍历等操作考验坐标定位能力。方法传参时引用传递与值传递的差异,直接影响数组修改是否生效。这些知识广泛应

weixin_33585822的博客 115

《Java 100 天进阶之路》第21篇:Java Object类

本文介绍了Java中Object类的核心知识点,包括它是所有类的父类,以及其关键方法如equals()、hashCode()、toString()等。重点讲解了equals()与==的区别,以及equals()和hashCode()的契约关系。通过Person类和Student类的代码示例,展示了如何正确重写这些方法。文章还提供了常见误区、面试考点和练习题,帮助读者掌握Object类的使用要点。作为Java类层次结构的根,Object类的理解对Java编程至关重要。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 495

数组拷贝方法

数组拷贝的方法有四种 分别为:for clone() System.arraycopy()Array.copyOf() 要研究数组的拷贝,先看看浅拷贝与深拷贝的概念: 概括起来讲,浅拷贝就是指两个对象公用一个值,一个的改变了另一个也会随之改变,深拷贝则是两个对象虽然值相等,但是相互独立互不影响。 1.for循环方法: 代码灵活,但效率低。 public class Arraycopy {...

weixin_43301647的博客 3101
上一篇: 供应链核心系统面试题及答案解析(2026版)
下一篇: 《Java 100 天进阶之路》第5篇:装箱和拆箱
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值