我有一个Vector<int[][]>
当我给它一个我的int[][]
数组的克隆而不是更改我的int[][]
数组中的某些内容并调用int[][] = Vector.get(0)
时,数组不会恢复到它应该的价值。
如何让我的int [] []成为Vector.get(0)的值?
import java.util.Vector;
public class ArrayFromVectorProblem {
public static void main(String[] args){
int[][] myArray = {{0,0,1, 0, 0}, {0,0,2,0,0}};
Vector<int[][]> myVector = new Vector<int[][]>();
myVector.add(myArray.clone());
myArray[1][2] = 5;
//should print 5, and prints 5
System.out.println("MyArray[1][2]: " + myArray[1][2]);
myArray = myVector.get(0);
//should print 2, and prints 5
System.out.println("MyArray[1][2] 2nd try: " + myArray[1][2]);
}
}
这是我的输出:
MyArray[1][2]: 5
MyArray[1][2] 2nd try: 5
答案 0 :(得分:3)
答案 1 :(得分:1)
在Java中,克隆多维数组会执行浅副本。您将获得一个新的外部数组,但内部数组仍将被共享,因此对内部数组的更改将影响原始外部数组及其克隆。如果需要深层复制,则需要使用java.util.Arrays
实用程序类或手动执行。
答案 2 :(得分:1)
您误解了克隆方法。克隆执行浅拷贝。
请参阅此其他stackoverflow文章:Does calling clone() on an array also clone its contents?
这意味着myVector.get(0)的唯一方面是外部数组,即第一维。第一个维度是克隆。但是,数组本身是对整数数组的引用数组。参考文献仍然指向原始对象。
答案 3 :(得分:1)
问题在于你有两种类型的数组:一种包含对象,另一种包含基本类型(int)。
如果需要,myArray不是多维int数组,而是指向多个一维int数组的一维对象数组(而int数组是一个对象)。这就是你记忆中的样子:
myArray1
0 -> intArray1
1 -> intArray2
与
intArray1 = [0, 0, 1, 0, 0]
intArray2 = [0, 0, 2, 0, 0]
因此,当您克隆myArray1时,会得到一个myArray2,它是一个单独的副本:
myArray1
0 -> intArray1
1 -> intArray2
myArray2
0 -> intArray1
1 -> intArray2
但myArray的两个副本都指向同一个intArrays!
在这里,您不仅需要克隆外部数组,还要克隆内部数组,这样最终您就拥有了一个结构
myArray1
0 -> intArray1
1 -> intArray2
myArray2
0 -> intArray3
1 -> intArray4
使用intArray3获取intArray1和intArray4的副本intArray2的副本。你可以手动使用循环,或google for java框架来帮助你做到这一点(可能是Google Guava,Apache Commons,或者标准java库中甚至还有一个帮助类)。