0

为了使我的问题易于理解,我使用以下示例代码。这段代码的输出是 5,而我希望它是 3。我猜 B 正在作为 A 的指针工作,但我希望 A 最初被复制到 B 中,并且 A 中的后续更改不应该影响 B .

import java.io.*;
public class fg

{

public static void main(String args[]) throws Exception
{

    int[] A = new int[3];
            A[0]=1;
            A[1]=3;
            A[3]=7;

    check(A);


}

public static void check(int[] A)
{               
    int[] B = A;

    A[1] = 5;

    System.out.println(B[1]);
}

}

4

2 回答 2

5

您需要显式创建一个副本,

int[] B = Arrays.copyOf(A, A.length);

因为int[]是引用类型,所以赋值只是复制引用(基本上是指针)。

如果数组元素本身不是原始类型,您可能需要深拷贝,所以

type B[] = new type[A.length];
for(int i = 0; i < A.length; ++i) {
    B[i] = makeCopyOf(A[i]);  
}

wheremakeCopyOf()应该创建一个type实例的合理副本。如果你没有找到更好的东西,type makeCopyOf(type orig) { return orig.clone(); }可以作为后备。

于 2012-11-05T12:52:03.830 回答
2

B 是一个引用,因此类似于指针(有各种不同 - 你不能做算术,它不是直接内存指针)。

因此,您必须创建您所指的结构(数组)的副本。请注意,如果您要复制对象,则可能需要deep copy。您可能必须在复制构造函数中执行此操作(请参阅这篇文章,了解为什么认为 clone() 已损坏

于 2012-11-05T12:53:04.503 回答