当使用get时,int [] []类型的向量不替换int [] []

时间:2013-11-23 15:27:54

标签: java arrays vector clone

我有一个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

4 个答案:

答案 0 :(得分:3)

请注意,myArray.clone()正在执行数组的浅表副本。

您期望的行为是您从深层复制中获得的行为。

查看此信息以查看差异:How do I copy an object in Java?

答案 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库中甚至还有一个帮助类)。