在java中制作数组副本的最佳程序是什么?

时间:2014-04-15 23:56:59

标签: 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) {

        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

2 个答案:

答案 0 :(得分:5)

  

这两个是记忆中的不同对象吗?

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

关键在于理解引用变量与它引用的对象之间的区别。如果要创建两个完全不同的数组,则需要使用System.arraycopy(...)。如果您还需要复制数组项,并且如果它是对象的数组,则需要复制引用,那么您需要进行深层复制。

答案 1 :(得分:0)

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

这会创建一个对象,由变量a引用。

int [][] t= {};

这会创建另一个对象,由变量t引用。

t=a;

现在t以前引用的对象是"忘记",t指向与a相同的对象。

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