我有一个不断更新的数组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];
}
但这似乎并不正确。请不要使用像深度复制等高级术语,因为我不知道那是什么意思。
当前回答
您可以尝试在Java中使用Arrays.copyOf()
int[] a = new int[5]{1,2,3,4,5};
int[] b = Arrays.copyOf(a, a.length);
其他回答
对于数组的空安全副本,还可以使用可选的Object.clone()方法。
int[] arrayToCopy = {1, 2, 3};
int[] copiedArray = Optional.ofNullable(arrayToCopy).map(int[]::clone).orElse(null);
来自http://www.journaldev.com/753/how-to-copy-arrays-in-java的精彩解释
Java数组复制方法
Object.clone(): Object class provides clone() method and since array in java is also an Object, you can use this method to achieve full array copy. This method will not suit you if you want partial copy of the array. System.arraycopy(): System class arraycopy() is the best way to do partial copy of an array. It provides you an easy way to specify the total number of elements to copy and the source and destination array index positions. For example System.arraycopy(source, 3, destination, 2, 5) will copy 5 elements from source to destination, beginning from 3rd index of source to 2nd index of destination. Arrays.copyOf(): If you want to copy first few elements of an array or full copy of array, you can use this method. Obviously it’s not versatile like System.arraycopy() but it’s also not confusing and easy to use. Arrays.copyOfRange(): If you want few elements of an array to be copied, where starting index is not 0, you can use this method to copy partial array.
你也可以使用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
所有的解决方案,调用长度从数组,添加你的代码冗余空检查器考虑的例子:
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
如果你想复制下列文件:
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