Java 复制数组
我有一个不断更新的数组Java 复制数组,java,arrays,copy,Java,Arrays,Copy,我有一个不断更新的数组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(inti=0;i您可以尝试使用 但是,在大多数情况下使用clone()可能更好: int[] src = ... int[] dest = src.clone(); 你可以尝试使用 但是,在大
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(inti=0;i您可以尝试使用
但是,在大多数情况下使用clone()可能更好:
int[] src = ...
int[] dest = src.clone();
你可以尝试使用
但是,在大多数情况下使用clone()可能更好:
int[] src = ...
int[] dest = src.clone();
你可以用
int[] a = new int[]{1,2,3,4,5};
int[] b = a.clone();
还有。您可以使用
int[] a = new int[]{1,2,3,4,5};
int[] b = a.clone();
同样如此。我感觉所有这些“复制阵列的更好方法”并不能真正解决您的问题
你说
我尝试了一个类似[…]的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);
Arrays.copyOf
在小数组上可能比a.clone()
快。两个复制元素的速度相同,但clone()返回Object
,因此编译器必须向int[]
插入隐式强制转换。您可以在字节码中看到它,如下所示:
ALOAD 1
INVOKEVIRTUAL [I.clone ()Ljava/lang/Object;
CHECKCAST [I
ASTORE 2
如果要制作以下内容的副本:
int[] a = {1,2,3,4,5};
这是一条路:
int[] b = Arrays.copyOf(a, a.length);
Arrays.copyOf
在小数组上可能比a.clone()
快。两个复制元素的速度相同,但clone()返回Object
,因此编译器必须向int[]
插入隐式强制转换。您可以在字节码中看到它,如下所示:
ALOAD 1
INVOKEVIRTUAL [I.clone ()Ljava/lang/Object;
CHECKCAST [I
ASTORE 2
所有从数组调用长度的解决方案,请添加代码冗余空校验码考虑以下示例:
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 CAMONS中的ARARYUTILS。您的代码变短:
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);
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 CAMONS中的ARARYUTILS。您的代码变短:
public void someMethod(int[] a) {
int[] b = ArrayUtils.clone(a);
}
您可以找到apachecommons,也可以使用它
示例:
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]
}
此方法与类似,但更灵活。两者都在引擎盖下使用System.arraycopy
见:
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]
}
您也可以使用
示例:
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]
}
此方法与类似,但更灵活。两者都在引擎盖下使用System.arraycopy
见:
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]
}
来自
Java数组复制方法
Object.clone():对象类提供clone()方法和自数组
在java中也是一个对象,可以用这个方法来实现完全的
数组副本。如果您需要的部分副本,则此方法不适合您
阵列
System.arraycopy():系统类arraycopy()是最好的方法
数组的部分副本。它为您指定
要复制的元素总数以及源阵列和目标阵列
索引位置。例如System.arraycopy(源、3、目标、,
2,5)将从源到目标复制5个元素,从
从源的第三个索引到目标的第二个索引
Arrays.copyOf():如果要复制数组的前几个元素或
数组的完整副本,您可以使用此方法。显然不是
像System.arraycopy()一样功能齐全,但也不容易混淆
使用
数组。copyOfRange():如果希望数组中的几个元素