java数组拷贝

在 Java 中,数组拷贝有多种方法,每种方法适用于不同的场景。以下是常见的数组拷贝方式及示例:


1. 使用 for 循环手动拷贝

特点:简单直接,适合小数组或需要自定义操作的场景。

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

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

2. 使用 System.arraycopy()

特点:高效(底层是 Native 方法),适合任意类型的数组。

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

// 参数:源数组, 源起始位置, 目标数组, 目标起始位置, 拷贝长度
System.arraycopy(src, 0, dest, 0, src.length);

3. 使用 Arrays.copyOf()

特点:简洁,适合拷贝整个数组或扩展数组长度。

import java.util.Arrays;

int[] src = {1, 2, 3, 4, 5};
int[] dest = Arrays.copyOf(src, src.length); // 拷贝整个数组
int[] partialCopy = Arrays.copyOf(src, 3);   // 拷贝前3个元素

4. 使用 Arrays.copyOfRange()

特点:拷贝数组的指定范围。

import java.util.Arrays;

int[] src = {1, 2, 3, 4, 5};
int[] dest = Arrays.copyOfRange(src, 1, 4); // 拷贝索引1到3的元素(左闭右开)
// 结果:{2, 3, 4}

5. 使用 clone() 方法

特点:直接调用数组对象的 clone() 方法,简洁但可能引发深浅拷贝问题。

int[] src = {1, 2, 3, 4, 5};
int[] dest = src.clone(); // 浅拷贝

浅拷贝 vs 深拷贝

  • 浅拷贝:上述方法均为浅拷贝。如果数组元素是对象,拷贝后的数组和原数组引用同一对象。

    class Person { String name; }
    
    Person[] src = {new Person("Alice"), new Person("Bob")};
    Person[] dest = Arrays.copyOf(src, src.length);
    
    // 修改 dest[0] 会影响 src[0]
    dest[0].name = "Charlie";
    System.out.println(src[0].name); // 输出 "Charlie"
    
  • 深拷贝:需要手动复制对象或使用序列化。

    // 示例:手动深拷贝
    Person[] dest = new Person[src.length];
    for (int i = 0; i < src.length; i++) {
        dest[i] = new Person(src[i].name);
    }
    

性能比较

  • 最快System.arraycopy()(底层优化)。
  • 最灵活Arrays.copyOf()Arrays.copyOfRange()(内部调用 System.arraycopy)。
  • 最直观for 循环(适合简单逻辑)。

注意事项

  1. 目标数组长度必须足够,否则抛出 ArrayIndexOutOfBoundsException
  2. 多维数组(如 int[][])的拷贝需要逐层处理(如遍历每一行拷贝)。

根据具体需求选择合适的方法!

posted @ 2025-03-24 17:07  bravecap  阅读(96)  评论(0)    收藏  举报