我有一个不断更新的数组a。我们设a =[1,2,3,4,5]。我需要做一个完全相同的副本a,并称之为b。如果a改变为[6,7,8,9,10],b应该仍然是[1,2,3,4,5]。最好的方法是什么?我尝试了一个for循环:

for(int i=0; i<5; i++) {
    b[i]=a[i];
}

但这似乎并不正确。请不要使用像深度复制等高级术语,因为我不知道那是什么意思。


当前回答

我有一种感觉,所有这些“复制数组的更好方法”都不能真正解决您的问题。

你说

我尝试了一个for循环,像[…]但它似乎不能正常工作?

看看这个循环,没有明显的理由让它不起作用……除非:

你以某种方式把a和b数组弄乱了(例如,a和b指向同一个数组),或者 您的应用程序是多线程的,不同的线程同时读取和更新a数组。

在任何一种情况下,复制的其他方法都不能解决潜在的问题。

解决第一种情况的办法是显而易见的。对于第二种场景,您必须找到同步线程的方法。原子数组类没有帮助,因为它们没有原子复制构造函数或克隆方法,但是使用原语互斥量进行同步就可以了。

(你的问题中有一些暗示让我认为这确实与线程有关;例如,你说a是不断变化的。)

其他回答

我有一种感觉,所有这些“复制数组的更好方法”都不能真正解决您的问题。

你说

我尝试了一个for循环,像[…]但它似乎不能正常工作?

看看这个循环,没有明显的理由让它不起作用……除非:

你以某种方式把a和b数组弄乱了(例如,a和b指向同一个数组),或者 您的应用程序是多线程的,不同的线程同时读取和更新a数组。

在任何一种情况下,复制的其他方法都不能解决潜在的问题。

解决第一种情况的办法是显而易见的。对于第二种场景,您必须找到同步线程的方法。原子数组类没有帮助,因为它们没有原子复制构造函数或克隆方法,但是使用原语互斥量进行同步就可以了。

(你的问题中有一些暗示让我认为这确实与线程有关;例如,你说a是不断变化的。)

如果你想复制下列文件:

int[] a = {1,2,3,4,5};

这是一条正确的道路:

int[] b = Arrays.copyOf(a, a.length);

数组。在小型数组上,copyOf可能比a.r onclone()更快。两者复制元素的速度相同,但clone()返回Object,因此编译器必须插入隐式转换为int[]。你可以在字节码中看到它,就像这样:

ALOAD 1
INVOKEVIRTUAL [I.clone ()Ljava/lang/Object;
CHECKCAST [I
ASTORE 2

我在2D数组中遇到了类似的问题,并在这里结束。 我复制了主数组并更改了内部数组的值,当两个副本中的值都发生变化时,我感到惊讶。基本上这两个副本都是独立的,但包含对相同内部数组的引用,我必须对内部数组做一个数组的副本来得到我想要的。

这有时被称为深度复制。同样的术语“深度复制”也可能有完全不同的、可以说更复杂的含义,这可能会令人困惑,特别是对于那些不明白为什么他们复制的数组没有按照应有的方式运行的人来说。这可能不是OP的问题,但我希望它仍然能有所帮助。

您可以尝试使用System.arraycopy()

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

System.arraycopy( src, 0, dest, 0, src.length );

但是,在大多数情况下使用clone()可能更好:

int[] src = ...
int[] dest = src.clone();

你可以使用

int[] a = new int[]{1,2,3,4,5};
int[] b = a.clone();