我有一个不断更新的数组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];
}
但这似乎并不正确。请不要使用像深度复制等高级术语,因为我不知道那是什么意思。
我有一个不断更新的数组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];
}
但这似乎并不正确。请不要使用像深度复制等高级术语,因为我不知道那是什么意思。
当前回答
你可以使用
int[] a = new int[]{1,2,3,4,5};
int[] b = a.clone();
也
其他回答
所有的解决方案,调用长度从数组,添加你的代码冗余空检查器考虑的例子:
int[] a = {1,2,3,4,5};
int[] b = Arrays.copyOf(a, a.length);
int[] c = a.clone();
//What if array a comes as local parameter? You need to use null check:
public void someMethod(int[] a) {
if (a!=null) {
int[] b = Arrays.copyOf(a, a.length);
int[] c = a.clone();
}
}
我建议您不要白费力气,而是使用已经执行了所有必要检查的实用程序类。考虑一下apache commons中的ArrayUtils。你的代码变得更短:
public void someMethod(int[] a) {
int[] b = ArrayUtils.clone(a);
}
你可以在那里找到Apache commons
您可以尝试在Java中使用Arrays.copyOf()
int[] a = new int[5]{1,2,3,4,5};
int[] b = Arrays.copyOf(a, a.length);
你可以使用
int[] a = new int[]{1,2,3,4,5};
int[] b = a.clone();
也
我有一种感觉,所有这些“复制数组的更好方法”都不能真正解决您的问题。
你说
我尝试了一个for循环,像[…]但它似乎不能正常工作?
看看这个循环,没有明显的理由让它不起作用……除非:
你以某种方式把a和b数组弄乱了(例如,a和b指向同一个数组),或者 您的应用程序是多线程的,不同的线程同时读取和更新a数组。
在任何一种情况下,复制的其他方法都不能解决潜在的问题。
解决第一种情况的办法是显而易见的。对于第二种场景,您必须找到同步线程的方法。原子数组类没有帮助,因为它们没有原子复制构造函数或克隆方法,但是使用原语互斥量进行同步就可以了。
(你的问题中有一些暗示让我认为这确实与线程有关;例如,你说a是不断变化的。)
你也可以使用Arrays.copyOfRange。
例子:
public static void main(String[] args) {
int[] a = {1,2,3};
int[] b = Arrays.copyOfRange(a, 0, a.length);
a[0] = 5;
System.out.println(Arrays.toString(a)); // [5,2,3]
System.out.println(Arrays.toString(b)); // [1,2,3]
}
此方法类似于Arrays。copyOf,但是它更灵活。它们都使用System。Arraycopy在引擎盖下。
See:
https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/Arrays.java?av=f