`

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

    博客分类:
  • JAVA
阅读更多
System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制。其函数原型是:
public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)
src:源数组;	srcPos:源数组要复制的起始位置;
dest:目的数组;	destPos:目的数组放置的起始位置;	length:复制的长度。
注意:src and dest都必须是同类型或者可以进行转换类型的数组.
有趣的是这个函数可以实现自己到自己复制,比如:
int[] fun ={0,1,2,3,4,5,6}; 
System.arraycopy(fun,0,fun,3,3);
则结果为:{0,1,2,0,1,2,6};
实现过程是这样的,先生成一个长度为length的临时数组,将fun数组中srcPos 
到srcPos+length-1之间的数据拷贝到临时数组中,再执行System.arraycopy(临时数组,0,fun,3,3).
分享到:
评论
3 楼 hikaru1012 2010-10-09  
楼主解释的正确。只有在源数组和目的数组是同一个数组时才会创建临时数组。
2 楼 hikaru1012 2010-10-09  
java.lang.System.arraycopy注释


void java.lang.System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Copies an array from the specified source array, beginning at the specified position, to the specified position of the destination array. A subsequence of array components are copied from the source array referenced by src to the destination array referenced by dest. The number of components copied is equal to the length argument. The components at positions srcPos through srcPos+length-1 in the source array are copied into positions destPos through destPos+length-1, respectively, of the destination array.

If the src and dest arguments refer to the same array object, then the copying is performed as if the components at positions srcPos through srcPos+length-1 were first copied to a temporary array with length components and then the contents of the temporary array were copied into positions destPos through destPos+length-1 of the destination array.

If dest is null, then a NullPointerException is thrown.

If src is null, then a NullPointerException is thrown and the destination array is not modified.

Otherwise, if any of the following is true, an ArrayStoreException is thrown and the destination is not modified:

The src argument refers to an object that is not an array.
The dest argument refers to an object that is not an array.
The src argument and dest argument refer to arrays whose component types are different primitive types.
The src argument refers to an array with a primitive component type and the dest argument refers to an array with a reference component type.
The src argument refers to an array with a reference component type and the dest argument refers to an array with a primitive component type.
Otherwise, if any of the following is true, an IndexOutOfBoundsException is thrown and the destination is not modified:

The srcPos argument is negative.
The destPos argument is negative.
The length argument is negative.
srcPos+length is greater than src.length, the length of the source array.
destPos+length is greater than dest.length, the length of the destination array.
Otherwise, if any actual component of the source array from position srcPos through srcPos+length-1 cannot be converted to the component type of the destination array by assignment conversion, an ArrayStoreException is thrown. In this case, let k be the smallest nonnegative integer less than length such that src[srcPos+k] cannot be converted to the component type of the destination array; when the exception is thrown, source array components from positions srcPos through srcPos+k-1 will already have been copied to destination array positions destPos through destPos+k-1 and no other positions of the destination array will have been modified. (Because of the restrictions already itemized, this paragraph effectively applies only to the situation where both arrays have component types that are reference types.)

パラメーター:
src the source array.
srcPos starting position in the source array.
dest the destination array.
destPos starting position in the destination data.
length the number of array elements to be copied.
スロー:
IndexOutOfBoundsException - if copying would cause access of data outside array bounds.
ArrayStoreException - if an element in the src array could not be stored into the dest array because of a type mismatch.
NullPointerException - if either src or dest is null.
1 楼 vivid_gxp 2009-09-13  
兄弟,你是怎么知道她的实现过程的?
据我所知,arraycopy是实现跨平台的。windows系统下是调用某个 dll 的。
而且arraycopy是通过native来声明的,那么就应该是通过C/C++来实现的。那你怎么就能肯定是用了一个临时数组呢?
如果需要将数据拷贝到临时数组,那么性能会很低的。
所以我觉得不应该像楼主所说的那样的。

(ps:(我也不知道具体是怎么实现的,上面的评论只是我的估计。)

相关推荐

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

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

    System.arraycopy和Arrays.copyOf

    `System.arraycopy` 和 `Arrays.copyOf` 都是Java中用于复制数组的方法,但它们在使用和处理异常情况上有所不同。这两个方法在处理数组复制时,提供了便利和效率,但各有其适用场景。 `System.arraycopy` 是一个...

    详解Java合并数组的两种实现方式

    使用System.arraycopy()方法可以实现数组的合并,例如: ```java String[] aa = {"11","22","33"}; String[] bb = {"44","55","66"}; String[] cc = {"77","88","99"}; // 合并两个数组 String[] dd = new String...

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

    Java提供了System类的arraycopy()方法,它是进行数组复制的最直接和高效的方式。该方法接受五个参数:源数组、源数组起始位置、目标数组、目标数组起始位置和复制的元素数量。例如: ```java int[] srcArray = {1...

    Java数组练习题(带答案).pdf

    12. **数组复制方法**:除了`=`符号外,还可以使用`System.arraycopy()`方法或`clone()`方法进行数组复制。 13. **数组元素表示**:数组的第三个元素通常表示为`a[2]`,因为下标是从0开始的。 14. **数组下标错误...

    07-Java基础(数组-常见问题)

    - 数组复制:可以使用System.arraycopy()方法或者遍历数组进行复制。 - 排序:使用Arrays.sort()方法对数组进行排序,适用于基本类型的数组;对于对象数组,需要自定义比较器。 - 查找:线性查找效率较低,而二分...

    Java数组特点及基本使用技巧

    2. 数组复制:可以使用System.arraycopy()方法来复制数组。 3. 数组排序:可以使用Arrays.sort()方法来排序数组。 4. 数组查找:可以使用Arrays.binarySearch()方法来查找某个元素。 关于数组的排序操作 1. 对象...

    19.java数组.zip

    - `System.arraycopy()`:用于复制数组的一部分到另一个数组。 - `Arrays.equals()`:比较两个数组是否相等(元素相同且顺序一致)。 - `Arrays.sort()`:对数组进行排序。 6. **多维数组** Java支持多维数组,...

    Java 数组练习题目.doc.docx

    16. 错误的说法是A,`=`不能实现数组复制,只能复制引用。 17. 会导致数组越界的是D,循环条件错误,会访问到a[10]。 18. main方法的合法声明是B,缺少void关键字。 这些知识点涵盖了数组的基本操作和特性,是Java...

    Java数组练习题(带答案)培训讲学.docx

    正确的复制数组的方式是使用`System.arraycopy()`或创建新数组并遍历原数组进行复制。 3. **数组存储位置**:JVM将数组存储在堆内存中,而不是栈内存,因为数组可能很大,栈内存不足以存储大数组。 4. **二分查找*...

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

    2. 使用`System.arraycopy()`复制原数组的元素到新数组,或者通过循环逐个复制。 例如,`ArrayCopy.java`文件可能有以下代码: ```java public class ArrayCopy { public static void main(String[] args) { int...

    使用循环操作Java中的数组共3页.pdf.zip

    - `System.arraycopy()`方法用于将一个数组的一部分或全部复制到另一个数组。 - `clone()`方法可以创建数组的浅拷贝。 7. **数组的排序**: - 对于基本类型数组,可以使用Arrays类提供的`sort()`方法进行排序。 ...

    Java数组练习题(带答案) (2).pdf

    11. 数组复制方法除了`arraycopy()`外,还可以使用循环逐个复制,但用`=`赋值只会复制引用。 12. 数组`a`的第三个元素用下标表示为`a[2]`。 13. 访问无效数组下标会抛出`ArrayIndexOutOfBoundsException`异常。 14. ...

    Java 的常用包与数组的复制与排序27

    1. 使用`System.arraycopy()`:这是一个静态方法,可以从源数组的指定位置开始,将一部分元素复制到目标数组的指定位置。例如: ```java int[] src = {1, 2, 3}; int[] dest = new int[src.length]; System....

    Java 数组练习答案.doc.pdf

    2. **数组复制**:在Java中,数组复制通常通过System.arraycopy()方法或使用for循环完成。复制时,实际上是复制数组的引用,而不是复制实际的数据副本。 3. **匿名数组**:没有显式定义变量的数组,可以直接创建并...

    「java三种字符数组合并的方法」.docx

    我们首先创建了一个新的字符串数组 c,然后使用 System.arraycopy 方法将数组 a 和 b 的元素复制到数组 c 中。 代码实现: ```java public static String[] getThreeArray() { String[] a = {"0", "1", "2"}; ...

    java三种字符数组合并的方法.doc

    // 使用System.arraycopy()复制数组 System.arraycopy(a, 0, c, 0, a.length); System.arraycopy(b, 0, c, a.length, b.length); return c; } ``` ### 合并不同类型的数组 除了以上介绍的字符数组合并外,还...

    Java_数组练习答案.docx

    2. **数组复制**:在Java中,当使用"="操作符复制数组时,实际上是复制了数组的引用,而不是复制数组的内容。这意味着两个数组会指向同一个内存位置,改变其中一个会影响另一个。 3. **匿名数组**:没有显式变量...

Global site tag (gtag.js) - Google Analytics