用java制作数组副本的最佳过程是什么
在下面的代码中,将一个数组对象分配给另一个数组对象t。这两个是内存中不同的对象,对吗?为什么更改一个对象会影响其他对象内容用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)
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);