想把二维数组作为元素存储到LinkedList中并读取使用。第一个for循环是存入过程,把九宫格中间的数字改写为0~2分别存入ll中,并马上输出最后一个元素的地址和数据进行验证,发现与预期一致(中间数字是0~2,3个地址互不相同)。但是第二个for循环的取出过程就出现问题了,每次用pollFirst()取ll的第一个元素并删除,发现输出的地址顺序与存入时一致,但是输出的数据(九宫格)全都是一样的。实在是不理解是怎么回事。 private static void test1() {
LinkedList<Integer[][]> ll = new LinkedList<Integer[][]>();
Integer[][] ii = {{9,9,9},{9,9,9},{9,9,9}};
Integer[][] jj,kk;

for(int n=0;n<3;n++) {
ii[1][1]=n;//改写九宫格中间的数字
jj=Arrays.copyOf(ii,3);//把改写的数据复制到jj中(虽然觉得可以省略,但是还是稳一点防止一些莫名其妙的问题)
ll.addLast(jj);//把jj添加到ll最后一个元素
System.out.println(ll.getLast());//输出ll最后一个元素的地址
print(ll.getLast());//输出ll最后一个元素的数据(九宫格)
}
System.out.println("========================================");
System.out.println("========================================");
for(int n=0;n<3;n++) {
kk = ll.pollFirst();//取出并删除ll第一个元素,存储到kk中
System.out.println(kk);//输出kk的地址
print(kk);//输出kk的数据
}
}
test1输出结果:
[[Ljava.lang.Integer;@15db9742
999
909
999
====================
[[Ljava.lang.Integer;@6d06d69c
999
919
999
====================
[[Ljava.lang.Integer;@7852e922
999
929
999
====================
========================================
========================================
[[Ljava.lang.Integer;@15db9742
999
929
999
====================
[[Ljava.lang.Integer;@6d06d69c
999
929
999
====================
[[Ljava.lang.Integer;@7852e922
999
929
999
====================之后想着简化问题,把二维数组改为了一维数组,得到的结果却与预期一致,这让我更困扰了。为什么一维数组可以,二维数组就不行啊? private static void test2() {
LinkedList<Integer[]> l = new LinkedList<Integer[]>();
Integer[] i = {9,9,9};
Integer[] j,k;

for(int n=0;n<3;n++) {
i[1]=n;
j=Arrays.copyOf(i,3);
l.addLast(j);
System.out.println(l.getLast());
print(l.getLast());
}
System.out.println("========================================");
System.out.println("========================================");
for(int n=0;n<3;n++) {
k = l.pollFirst();
System.out.println(k);
print(k);
}
}
test2输出结果:
[Ljava.lang.Integer;@15db9742
909
====================
[Ljava.lang.Integer;@6d06d69c
919
====================
[Ljava.lang.Integer;@7852e922
929
====================
========================================
========================================
[Ljava.lang.Integer;@15db9742
909
====================
[Ljava.lang.Integer;@6d06d69c
919
====================
[Ljava.lang.Integer;@7852e922
929
====================其中print是我自己写的输出函数,应该没什么问题: public static void print(Integer[][] ii) {
for(int n=0;n<ii.length;n++) {
for(int m=0;m<ii[n].length ;m++) {
System.out.print(ii[n][m]);
}
System.out.println();
}
System.out.println("====================");
}
public static void print(Integer[] i) {
for(int n=0;n<i.length;n++) {
System.out.print(i[n]);
}
System.out.println();
System.out.println("====================");
}主函数就是调用两个test,也应该没问题: public static void main(String[] args) {
//test1();
test2();
}

解决方案 »

  1.   

    这个是对象的引用导致的。二维数组你在copy的过程中,新的二维数组中的每个第一维i[n]指向的数组对象是和原数组一样的。即List中的三个二维数组中的每个第一维的值指向的对象是同一个。你的赋值只是改变了i[1]指向的那个对象内部的一个值,而不是改变了i[1].而一维数组赋值i[1]的过程i[1]就指向了新的地址。所以结果会正常显示。
      

  2.   


    谢谢!我在第二个for循环分别输出了ii[0],ii[1],ii[2]的地址值,发现每个ii[0],ii[1],ii[2]的地址值真的是一样的。但是为什么ii的地址值各不相同呢?要怎么修改才能让每次取出的和存入的二维数组一致呢?
      

  3.   

    在第一次for循环的时候,每次都改变jj数组的引用,即每次都让jj的引用指向新的二维数组。
      

  4.   

    二维数组你在copy的过程中,新的二维数组中的每个第一维i[n]指向的数组对象是和原数组一样的。  http://blog.csdn.net/ochangwen/article/details/50587937