Java数组拷贝的四种常用方式总结

 更新时间:2025年12月08日 09:16:29   作者:Geoking.  
数组是 Java 最基础的数据结构之一,而 数组的拷贝(复制) 是开发中经常遇到的需求,Java 提供了多种数组复制方式,每种方式都有自己的特点和适用场景,本篇文章将系统总结 Java 中 数组拷贝的 4 种常用方式,需要的朋友可以参考下

引言

数组是 Java 最基础的数据结构之一,而 数组的拷贝(复制) 是开发中经常遇到的需求,例如:

  • 扩容数组
  • 复制部分元素
  • 深拷贝/防御性拷贝
  • 避免直接引用修改原数组

Java 提供了多种数组复制方式,每种方式都有自己的特点和适用场景。

本篇文章将系统总结 Java 中 数组拷贝的 4 种常用方式

一、Java 数组拷贝的四种方式

1. 使用for循环(最原始、最灵活)

示例代码:

int[] src = {1, 2, 3, 4};
int[] dest = new int[src.length];

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

优点:

  • 简单直接
  • 可自定义拷贝规则(如过滤、条件拷贝)

缺点:

  • 代码冗长
  • 性能较低(相比原生 API)

适用于 需要完全自定义拷贝行为的场景

2. 使用System.arraycopy()(性能最优)

示例代码:

int[] src = {1, 2, 3, 4};
int[] dest = new int[4];

System.arraycopy(src, 0, dest, 0, src.length);

参数解释:

System.arraycopy(
    Object src,     // 源数组
    int srcPos,     // 源数组起始下标
    Object dest,    // 目标数组
    int destPos,    // 目标数组起始下标
    int length      // 拷贝长度
);

优点:

  • 底层为 JVM 实现(native native 方法),性能最高
  • 可指定部分区域拷贝

缺点:

  • 参数较多,容易出错
  • 类型必须兼容(否则抛异常)

最推荐用于 高性能场景

3. 使用Arrays.copyOf()/Arrays.copyOfRange()(最常用)

3.1Arrays.copyOf()

适合复制整个数组或扩容数组。

int[] src = {1, 2, 3};
int[] dest = Arrays.copyOf(src, 5); // 扩容成长度 5

输出:

[1, 2, 3, 0, 0]

3.2Arrays.copyOfRange()

适合复制部分区域。

int[] src = {1, 2, 3, 4, 5};
int[] part = Arrays.copyOfRange(src, 1, 4);

输出:

[2, 3, 4]

优点:

  • 使用简单,参数不多
  • 可以返回不同长度的新数组
  • 返回泛型,支持所有类型

缺点:

  • 性能略逊于 System.arraycopy(内部也是基于它实现)

最常用于 普通开发、快速复制、数组扩容

4. 使用clone()(最简洁的深拷贝)

示例代码:

int[] src = {1, 2, 3};
int[] dest = src.clone();

优点:

  • 语法最简单
  • 创建的是独立数组,不会影响原数组
  • 性能很好,底层仍然是 System.arraycopy

缺点:

  • 只适用于一维数组
  • 对于二维数组只复制外层,是浅拷贝
int[][] arr2d = {{1,2}, {3,4}};
int[][] clone = arr2d.clone();

clone[0][0] = 99;
System.out.println(arr2d[0][0]); // 99(浅拷贝)

适用于 简单复制整个数组的场景

二、四种数组复制方式对比总结

方法是否新数组是否支持部分复制性能是否浅拷贝适用场景
for
循环
✔(自定义)⭐☆☆深拷贝自定义规则
System.arraycopy⭐⭐⭐浅拷贝高性能需求
Arrays.copyOf✘(复制整个)⭐⭐⭐浅拷贝扩容 / 常规复制
Arrays.copyOfRange⭐⭐⭐浅拷贝区间复制
clone()⭐⭐⭐浅拷贝快速整体复制

一句话总结:

普通场景用 Arrays.copyOf
高性能场景用 System.arraycopy
语法最简单用 clone()
自定义逻辑用 for 循环

到此这篇关于Java数组拷贝的四种常用方式总结的文章就介绍到这了,更多相关Java数组拷贝方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Java中Bean的作用域详解

    关于Java中Bean的作用域详解

    这篇文章主要介绍了关于Java中Bean的作用域详解,限定程序中变量的可⽤范围叫做作⽤域,或者说在源代码中定义变量的某个区域就叫做作⽤域,需要的朋友可以参考下
    2023-08-08
  • 深入探究SpringBoot拦截器的自定义设计与实现全攻略

    深入探究SpringBoot拦截器的自定义设计与实现全攻略

    拦截器是Spring框架提供的核心功能之⼀,主要用来拦截用户的请求,在指定方法前后,根据业务需要执行预先设定的代码,本文将给大家和大家一起深入探究SpringBoot拦截器的自定义设计与实现,需要的朋友可以参考下
    2024-05-05
  • 深入了解java8的foreach循环

    深入了解java8的foreach循环

    虽然java8出来很久了,但是之前用的一直也不多,最近正好学习了java8。下面给大家分享java8中的foreach循环,感兴趣的朋友一起看看吧
    2017-05-05
  • Java动态追踪技术探究之从JSP到Arthas

    Java动态追踪技术探究之从JSP到Arthas

    这篇文章主要介绍了Java动态追踪技术探究之从JSP到Arthas,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • 分布式医疗挂号系统SpringCache与Redis为数据字典添加缓存

    分布式医疗挂号系统SpringCache与Redis为数据字典添加缓存

    这篇文章主要为大家介绍了分布式医疗挂号系统SpringCache与Redis为数据字典添加缓存,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • 一文详解jvm中的引用类型

    一文详解jvm中的引用类型

    在Java中对象以引用来指向JVM的内存区块,这里我们总结了强引用、软引用、弱引用和假象引用(幽灵引用),下面这篇文章主要给大家介绍了关于jvm中引用类型的相关资料,需要的朋友可以参考下
    2024-04-04
  • Java程序与C语言的区别浅析

    Java程序与C语言的区别浅析

    Java和C语言虽有相同性,但两者也有一定的不同。Java程序是面向对象的一种简单、分布式 、解释、健壮、安全、结构中立、可移植、高效能、多线程、动态的语言它是面向对象而C语言是面向过程的,这是最大的不同,对于学过C语言的我们来说,Java可以说是比较简单的编程语言
    2017-04-04
  • Java实现的简单画图板示例

    Java实现的简单画图板示例

    这篇文章主要介绍了Java实现的简单画图板,涉及java使用swing组件进行图形绘制相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • SpringBoot使用hutool-captcha实现验证码生成与验证

    SpringBoot使用hutool-captcha实现验证码生成与验证

    在springboot的登陆页面中为了防止机器大规模注册,机器暴力破解数据密码等危害,需要验证随机生成的验证码,本文主要介绍了SpringBoot使用hutool-captcha实现验证码生成与验证,感兴趣的可以了解一下
    2023-12-12
  • maven私服搭建的实现步骤

    maven私服搭建的实现步骤

    本文主要介绍了maven私服搭建的实现步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10

最新评论