`

如何实现数组的复制?

 
阅读更多

复制数组的方法:
在JAVA里面,可以用复制语句“A=B”给基本类型的数据传递值,但是如果A,B是两个同类型的数组,复制就相当于将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么引用同一数组的变量也要发生改变。
这个类似C或C++中(指针)地址传递。
以下是归纳的JAVA中复制数组的方法:
1。使用FOR循环,将数组的每个元素复制
2。使用clone方法,得到数组的值,而不是引用
3。使用System.arraycopy(s,start1,t,start2,length)方法
(注意:s是原数组,t是目标数组,start1&start2是开始复制下标,length一般是s的长度,÷
由于arraycopy方法不给目标数组分配内存空间,所以必需要先为t分配内存空间!)

//使用clone和arraycopy的例子

public class UseArray{

public static void main(String[] args){

int[] s1={5,6,8,21};

int[] s2;

s2=(int[]) s1.clone();//使用clone创建sorces副本,注意clone要使用强制转换

System.out.println("use clone method");

pa(s1);

pa(s2);

System.out.println("use arraycopy method");

int [] s3=new int[s1.length];//s3必须先初始化分配空间

System.arraycopy(s1,0,s3,0,s1.length);

pa(s3);

}

public static void pa(int [] a){

for(int i=0;i<a.length;i++){

System.out.print(a[i]+" ");

}

System.out.println();

}

}

————————————————————————————————————————————————————————————————————————————————————————

arraycopy
public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。从 src 引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。被复制的组件的编号等于 length 参数。源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 destPos+length-1 位置。
如果参数 src 和 dest 引用相同的数组对象,则复制的执行过程就好像首先将 srcPos 到 srcPos+length-1 位置的组件复制到一个带有 length 组件的临时数组,然后再将此临时数组的内容复制到目标数组的 destPos 到 destPos+length-1 位置一样。

If 如果 dest 为 null,则抛出 NullPointerException 异常。

如果 src 为 null, 则抛出 NullPointerException 异常,并且不会修改目标数组。

否则,只要下列任何情况为真,则抛出 ArrayStoreException 异常并且不会修改目标数组:

src 参数指的是非数组对象。
dest 参数指的是非数组对象。
src 参数和 dest 参数指的是那些其组件类型为不同基本类型的数组。
src 参数指的是具有基本组件类型的数组且 dest 参数指的是具有引用组件类型的数组。
src 参数指的是具有引用组件类型的数组且 dest 参数指的是具有基本组件类型的数组。
否则,只要下列任何情况为真,则抛出 IndexOutOfBoundsException 异常,并且不会修改目标数组:

srcPos 参数为负。
destPos 参数为负。
length 参数为负。
srcPos+length 大于 src.length,即源数组的长度。
destPos+length 大于 dest.length,即目标数组的长度。
否则,如果源数组中 srcPos 到 srcPos+length-1 位置上的实际组件通过分配转换并不能转换成目标数组的组件类型,则抛出 ArrayStoreException 异常。在这种情况下,将 k 设置为比长度小的最小非负整数,这样就无法将 src[srcPos+k] 转换为目标数组的组件类型;当抛出异常时,从 srcPos 到 srcPos+k-1 位置上的源数组组件已经被复制到目标数组中的 destPos 到 destPos+k-1 位置,而目标数组中的其他位置不会被修改。(因为已经详细说明过的那些限制,只能将此段落有效地应用于两个数组都有引用类型的组件类型的情况。)

参数:
src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目标数据中的起始位置。
length - 要复制的数组元素的数量。
抛出:
IndexOutOfBoundsException - 如果复制会导致对数组范围以外的数据的访问。
ArrayStoreException - 如果因为类型不匹配而使得无法将 src 数组中的元素存储到 dest 数组中。
NullPointerException - 如果 src 或 dest 为 null。 

分享到:
评论

相关推荐

    使用System.arraycopy()实现数组之间的复制

    使用System.arraycopy()实现数组之间的复制

    System.arraycopy实现数组之间的复制

    ### System.arraycopy实现数组之间的复制 在Java编程语言中,`System.arraycopy()`是一个非常实用且高效的方法,用于在数组之间复制元素。此方法属于`java.lang.System`类,并且是一个静态方法,这意味着可以直接...

    实现数组复制常用的5种方式及组合类的深复制(深拷贝)

    在Java编程中,数组复制是常见的操作,有多种方法可以实现这一目标,包括浅复制和深复制。浅复制仅复制对象引用,而深复制则复制整个对象及其引用的对象。这里我们将详细讨论五种常见的数组复制方法,并探讨如何通过...

    java高端技术课程--Java数组如何实现复制

    数组复制是编程中常见的操作,特别是在处理数据时需要备份或移动数据的场景。本篇文章将深入探讨Java中数组的复制方法及其相关知识点。 1. **浅拷贝与深拷贝** 在Java中,数组的复制分为浅拷贝和深拷贝两种。浅...

    C++实现数组类

    以下是对`C++实现数组类`这一主题的详细解释。 首先,我们来了解C++中的原始数组。在C++中,数组定义了一段连续的内存空间,用于存储同类型的元素。例如,定义一个整型数组可以这样写: ```cpp int arr[5]; ``` ...

    嵌入式 ARM程序 数组复制

    本程序示例展示了如何在ARM架构下实现基本的数组复制功能。通过对寄存器的巧妙使用以及高效的指令选择,程序实现了快速而简洁的数据复制过程。理解此类基础程序对于学习嵌入式系统开发至关重要,特别是对于初学者而...

    基于C#语言实现数组的计算

    本教程将深入探讨如何在C#中实现数组的各种操作,包括创建、初始化、计算随机和以及排序。以下是对这些概念的详细解释: 1. **数组的创建与初始化**: 在C#中,你可以声明一个数组变量,指定它的类型和长度。例如...

    设计并模拟实现整型多维数组类型

    在数据结构的学习中,设计并模拟实现整型多维数组类型是一项重要的实践任务。多维数组是计算机科学中处理复杂数据的一种基础结构,它能够帮助我们有效地存储和操作矩阵或类似表格的数据。在这个课程设计中,我们将...

    易语言使用变量数组来无限复制组件源码

    总结一下,易语言中利用变量数组复制组件源码的关键步骤包括: 1. 定义变量数组来存储组件对象。 2. 创建组件实例,并将其添加到数组中。 3. 使用循环结构动态复制组件。 4. 设置组件事件,确保每个组件都能响应用户...

    复制数组或从数组中抽取特定元素组成新数组

    在JavaScript中,有几种方法可以实现数组的复制: #### 1. 使用 `slice()` 方法 `Array.prototype.slice` 是一种非常直观且高效的方法来复制数组。这个方法返回一个新的数组对象,这个数组包含从start到end(不...

    微机原理实验二——循环程序结构和过程调用程序设计

    这部分要求实现数组的排序以及将排序后的数组复制到另一段中。 #### 示例代码 ```assembly DATA1SEGMENT XDB32,-43,76,95,-1,-78,127,-128,-125,88 CNTDB$-X DATA1ENDS DATA2SEGMENT DB20DUP(0) DATA2ENDS ...

    TIA博途中复制存储区和结构体数据的几种方法.docx

    - 通过使用特定指令,如"MOVE"或"SCL语言中的PEEK指令",实现从输入模块到数据块的数据复制。 - **注意事项**: - 对于S7-1200 CPU,需要固件版本V4.1或更高。 #### 四、总结 通过上述实例可以看出,TIA博途中...

    分离字数组array中正,负数,把其中正数复制到pdata数组,负数复制到ndata数组,并分别统计正,负数个数

    标题中的任务是将一个包含正负整数的数组(array)分离,将正数复制到新的数组(pdata),负数复制到另一个数组(ndata),同时统计正数和负数的数量。这个过程涉及到汇编语言编程,特别是分支程序设计。下面我们将...

    数组 简单 插入 删除 复制 操作

    本篇将详细介绍Java数组中的插入、删除和复制操作,以及相关的实践示例。 ### 数组的插入操作 插入操作通常涉及到在数组的某个位置插入一个新元素,这可能需要将后续元素向后移动。在Java中,可以使用以下步骤实现...

    数组、字典深复制

    了解如何在Objective-C或Swift中实现数组和字典的深复制,以及自定义对象如何遵循`NSCopying`协议,对于编写高效且可靠的代码至关重要。在实际项目中,合理运用深复制能够提高代码的稳定性和可维护性。

    python数组复制拷贝的实现方法

    本文实例讲述了python数组复制拷贝的实现方法。分享给大家供大家参考。具体分析如下: python中直接通过等号赋值实际上只是引用地址的传递 如: a = [1,2,3,4,5] b=a 当a的值改变时,b的值也会随之改变 如果希望b...

    C语言数组形链表实现

    本文将深入探讨如何使用C语言实现数组形链表,并详细讲解其相关接口。 首先,我们需要定义数组形链表的数据结构。它通常包含一个数组,用于存储元素,以及一个指示当前数组容量的变量。当数组满时,我们可以通过...

    动态数组的实现(利用动态数组增长实现的)

    下面我们将深入探讨动态数组的概念、实现原理以及如何在实际项目中读取文件并将数据存储到动态数组中。 动态数组与静态数组的主要区别在于,静态数组在编译时就确定了其大小,而动态数组的大小可以在程序运行过程中...

    队列的链表与数组分别实现

    6. 队列扩容:当队列满时,可以创建一个更大的新数组,然后将旧数组中的元素复制到新数组中。 ### 链表实现队列 链表实现队列更加灵活,因为它的大小可以根据需要动态扩展。链表由一系列节点组成,每个节点包含...

Global site tag (gtag.js) - Google Analytics