用java制作数组副本的最佳过程是什么

用java制作数组副本的最佳过程是什么,java,Java,在下面的代码中,将一个数组对象分配给另一个数组对象t。这两个是内存中不同的对象,对吗?为什么更改一个对象会影响其他对象内容 package test.main; import java.util.LinkedHashSet; import java.util.Set; public class C1 implements I1,I2{ /** * @param args */ public static void main(String[] args)

在下面的代码中,将一个数组对象分配给另一个数组对象t。这两个是内存中不同的对象,对吗?为什么更改一个对象会影响其他对象内容

package test.main;

import java.util.LinkedHashSet;
import java.util.Set;

public class C1 implements I1,I2{

    /**
     * @param args
     */
    public static void main(String[] args) {

        int [][] a= {{1,2}};    

        int [][] t= {};
        t=a;
        t[0][0] = 3;
        System.out.println("t "+t[0][0]);
        System.out.println("a "+a[0][0]);
    }

    @Override
    public void staticMethod() {
        // TODO Auto-generated method stub

    }

}
输出:

t 3
a 3
这两个是内存中不同的对象,对吗

不,它们是引用同一数组对象的两个不同变量

关键在于理解参考变量与其所指对象之间的差异。如果要创建两个完全不同的阵列,则需要使用
System.arraycopy(…)
。如果您还需要复制数组项,并且如果它是一个对象数组、引用数组,那么您需要进行深度复制

int [][] a= {{1,2}};    
这将创建一个对象,由变量
a
引用

int [][] t= {};
这将创建另一个对象,由变量
t
引用

t=a;
现在以前由
t
引用的对象被“遗忘”,并且
t
指向与
a
相同的对象

int [][] t= {};

这就是为什么使用变量
t
修改对象时,与使用变量
a
相同。它只是访问同一事物的两种方式。像两扇门一样进入同一个房间。

谢谢,在这种情况下,制作阵列副本的最佳方法是什么?使用clone()还是使用临时数组?两者都不是。正如@HovercraftFullOfEels所指出的,您可以使用
System.arraycopy()
。在java 1.6中,他们引入了Array Util类来执行相同的操作:int[]newArray=Arrays.copyOf(a,newLength);