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():如果希望数组中的几个元素