【java】方法--拷贝数组

news/2025/2/22 10:55:12/

在 Java 中,拷贝数组 是指将一个数组的内容复制到另一个数组中。数组拷贝可以分为 浅拷贝 和 深拷贝,具体取决于数组元素的类型(基本数据类型或引用数据类型)。以下是几种常见的数组拷贝方法:


1. 使用 for 循环手动拷贝

这是最基础的方法,通过遍历原数组,将每个元素复制到新数组中。

示例:

java

Copy

public class Main {public static void main(String[] args) {int[] original = {1, 2, 3, 4, 5};int[] copy = new int[original.length];// 使用 for 循环拷贝数组for (int i = 0; i < original.length; i++) {copy[i] = original[i];}// 打印拷贝后的数组for (int num : copy) {System.out.print(num + " ");}}
}
  • 输出结果

    Copy

    1 2 3 4 5
  • 特点

    • 适用于基本数据类型数组和引用数据类型数组。

    • 对于引用数据类型数组,拷贝的是引用(浅拷贝)。


2. 使用 System.arraycopy() 方法

System.arraycopy() 是 Java 提供的一个高效数组拷贝方法。

语法:

java

Copy

System.arraycopy(原数组, 原数组起始位置, 目标数组, 目标数组起始位置, 拷贝长度);
示例:

java

Copy

public class Main {public static void main(String[] args) {int[] original = {1, 2, 3, 4, 5};int[] copy = new int[original.length];// 使用 System.arraycopy 拷贝数组System.arraycopy(original, 0, copy, 0, original.length);// 打印拷贝后的数组for (int num : copy) {System.out.print(num + " ");}}
}
  • 输出结果

    Copy

    1 2 3 4 5
  • 特点

    • 高效,底层是 native 方法。

    • 适用于基本数据类型数组和引用数据类型数组。

    • 对于引用数据类型数组,拷贝的是引用(浅拷贝)。


3. 使用 Arrays.copyOf() 方法

Arrays.copyOf() 是 Java 提供的一个简便的数组拷贝方法。

语法:

java

Copy

目标数组 = Arrays.copyOf(原数组, 新数组长度);
示例:

java

Copy

import java.util.Arrays;public class Main {public static void main(String[] args) {int[] original = {1, 2, 3, 4, 5};// 使用 Arrays.copyOf 拷贝数组int[] copy = Arrays.copyOf(original, original.length);// 打印拷贝后的数组for (int num : copy) {System.out.print(num + " ");}}
}
  • 输出结果

    Copy

    1 2 3 4 5
  • 特点

    • 简洁易用。

    • 适用于基本数据类型数组和引用数据类型数组。

    • 对于引用数据类型数组,拷贝的是引用(浅拷贝)。


4. 使用 clone() 方法

Java 中的数组是对象,因此可以使用 clone() 方法来拷贝数组。

示例:

java

Copy

public class Main {public static void main(String[] args) {int[] original = {1, 2, 3, 4, 5};// 使用 clone 方法拷贝数组int[] copy = original.clone();// 打印拷贝后的数组for (int num : copy) {System.out.print(num + " ");}}
}
  • 输出结果

    Copy

    1 2 3 4 5
  • 特点

    • 简单易用。

    • 适用于基本数据类型数组和引用数据类型数组。

    • 对于引用数据类型数组,拷贝的是引用(浅拷贝)。


5. 深拷贝与浅拷贝

  • 浅拷贝:只拷贝数组的引用,新数组和原数组共享相同的元素(适用于基本数据类型数组)。

  • 深拷贝:拷贝数组的所有元素,包括引用数据类型数组中的对象(需要手动实现)。

深拷贝示例:

java

Copy

class Person implements Cloneable {String name;Person(String name) {this.name = name;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}public class Main {public static void main(String[] args) throws CloneNotSupportedException {Person[] original = {new Person("Alice"), new Person("Bob")};Person[] copy = new Person[original.length];// 深拷贝for (int i = 0; i < original.length; i++) {copy[i] = (Person) original[i].clone();}// 修改原数组中的对象original[0].name = "Charlie";// 打印拷贝后的数组for (Person person : copy) {System.out.println(person.name);}}
}
  • 输出结果

    Copy

    Alice
    Bob
  • 特点

    • 深拷贝后,修改原数组中的对象不会影响新数组。


6. 总结

  • 浅拷贝:适用于基本数据类型数组,或引用数据类型数组的引用拷贝。

  • 深拷贝:适用于引用数据类型数组,需要手动实现。

  • 常用方法

    • for 循环:灵活,适用于所有场景。

    • System.arraycopy():高效,推荐使用。

    • Arrays.copyOf():简洁易用。

    • clone():简单,但需要实现 Cloneable 接口。


http://www.ppmy.cn/news/1572597.html

相关文章

Autojs: 使用 SQLite

例子 let db new SQLiteUtil("/sdcard/A_My_DB/sqlite.db");db.fastCreateTable("user_table",{name: "",online: false,},["name"] // 设置 name 为唯一, 重复项 不会添加成功 );// 新增数据的 ID let row_id db.insert("use…

Guava学习(一)

避免使用Null值 在程序开发中&#xff0c;特别是涉及到集合的场景&#xff0c;90%都不允许null值的存在&#xff0c;特别是null值存在歧义&#xff0c;当使用ConcurrentMap是为了并发安全不允许将null值作为key&#xff0c;但是普通map允许null值为key&#xff0c;当null作为k…

springboot整合mybatis-plus(保姆教学) 及搭建项目

一、Spring整合MyBatis (1)将MyBatis的DataSource交给Spring IoC容器创建并管理&#xff0c;使用第三方数据库连接池(Druid&#xff0c;C3P0等)代替MyBatis内置的数据库连接池 (2)将MyBatis的SqlSessionFactory交给Spring IoC容器创建并管理&#xff0c;使用spring-mybatis整…

MySQL8.0 高级SQL优化深度实践指南

MySQL 8.0作为当前主流的关系型数据库版本,不仅在性能上实现了显著提升,更在查询优化器和执行计划方面进行了革命性改进。新版引入了基于代价的优化器(Cost-Based Optimizer, CBO)增强功能,能够更准确地评估查询成本,并选择最优的执行路径。这种改进使得复杂查询的处理效…

20250214 随笔 Nginx 负载均衡在数据库中的应用

Nginx 负载均衡在数据库中的应用 在高并发环境下&#xff0c;数据库的性能往往是系统的瓶颈。为了提高数据库的吞吐能力、优化请求分配、减少单点故障&#xff0c;我们可以使用 Nginx 负载均衡 来优化数据库的访问。本文将介绍如何使用 Nginx 进行数据库负载均衡&#xff0c;以…

ArrayList、LinkedList、Vector

ArrayList 和 LinkedList 的区别是什么&#xff1f; 数据结构实现&#xff1a;ArrayList 是动态数组的数据结构实现&#xff0c;而 LinkedList 是双向链表的数据结构实 现。 随机访问效率&#xff1a;ArrayList 比 LinkedList 在随机访问的时候效率要高&#xff0c;因为 Linked…

moveable 一个可实现前端海报编辑器的 js 库

目录 缘由-胡扯本文实验环境通用流程1.基础移动1.1 基础代码1.1.1 data-* 解释 1.2 操作元素创建1.3 css 修饰1.4 cdn 引入1.5 js 实现元素可移动1.6 图片拖拽2.缩放3.旋转4.裁剪 懒得改文案了&#xff0c;海报编辑器换方案了&#xff0c;如果后面用别的再更。 缘由-胡扯 导火…

Include多表查询

DeepSeek 在 C# 中,Include 方法通常用于 Entity Framework (EF) 或 Entity Framework Core 中,用于 预先加载相关数据(Eager Loading)。它的主要作用是在查询数据库时,将关联的实体数据一并加载到内存中,避免后续使用时触发额外的数据库查询(即延迟加载,Lazy Loading…