Java中如何将一个数组复制到另一个数组


本文描述了将一个数组值复制到另一个数组中的方法。

不要忘记在Java中数组是一个对象,这意味着管理值集合的数组变量是一个引用,一个指针,它包含数组第一个元素的地址。

Java数组不是这样复制的

所以必须知道: 数组的元素 不是这样复制的

1
2
3
4
5
6
7
8
9
10
// 初始化数组
int[] oldArray = {1,2,3,4,5};
//新数组
int[] newArray;
// 浅复制-复制引用值
newArray = oldArray;
// 使用第二个引用来打印一个值
// 打印值3
System.out.println(newArray[2]);

很少有情况需要这样的“复制”(浅复制),但大多数情况下这是一个错误。
最后,没有复制初始数组元素,但是在新引用 new array中复制了第一个引用值 oldArray

Java中的数组浅拷贝

即使它看起来是值的成功复制(显示一个值证明了这一点),问题是通过两个引用之一的值的任何更改都在第二个引用可见。

1
2
3
4
5
// 使用第一个数组引用修改一个值
oldArray[0] = 100;
// 使用第二个引用打印第一个值
System.out.println(newArray[0]); // 也是100

如果这种情况不是我们想要的,那将是一个很难管理的情况,因为它是一个逻辑错误,不会产生编译错误或者运行时错误。

我们所看到的被称为 浅拷贝,因为它只发生在参考层。
我们最感兴趣的是内容的拷贝—— 深度拷贝

Java深度拷贝

在Java中,有两种可能将值从一个数组复制到另一个数组:

  1. 自己实现复制算法;

  2. 使用API函数。

对于第一种方法,复制意味着:

  1. 定义一个新数组;
  2. 为新数组分配空间;
  3. 从初始数组复制值:
1
2
3
4
5
6
7
8
9
// 初始化数组
int[] oldArray = {1,2,3,4,5};
//定义一个新的数组,并分配空间
int[] newArray = new int[oldArray.length];
// 复制值
for(int i =0;i < oldArray.length;i++)
newArray[i] = oldArray[i];

第二种方法基于使用 system库中的 arraycopy函数:

  1. 定义一个新数组;
  2. 为新数组分配空间;
  3. 使用arraycopy复制数组的初始值:
1
2
3
4
5
6
7
// 初始化数组
int[] oldArray = {1,2,3,4,5};
//定义一个新的数组,并分配空间
int[] newArray = new int[oldArray.length];
// 复制值
System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);


原文链接:https://codingdict.com/