java - 列表问题 - 当我运行时,为什么它在第3次打印输出时打印出-4?

时间:2010-09-25 10:05:26

标签: java arrays list

package javaapplication8;

public class Main {

   public static void main(String[] args) {
     int[] list1 = {1, 2, 3,4};
     int[] list2 = {5, 6, 7,8};

     for (int i = 0; i < list2.length; i++){
       System.out.print(list2[i] + " ");
     }
     System.out.println("");

     list2 = list1;

     for (int i = 0; i < list2.length; i++){
       System.out.print(list2[i] + " ");
     }
     System.out.println("");

     //Change list1
     list1[0] = -1;

     //Change list2
     list2[3] = -4;

     //List1 output
     for (int i = 0; i < list1.length; i++){
       System.out.print(list1[i] + " ");
     }
     System.out.println("");

     //List2 output
     for (int i = 0; i < list2.length; i++){
       System.out.print(list2[i] + " ");
     }
     System.out.println("");

     //Set list1
     list1 = new int[2];
     list1[0] = 100;
     list1[1] = 99;

     //List1 output
     for (int i = 0; i < list1.length; i++){
       System.out.print(list1[i] + " ");
     }
     System.out.println("");

     //List2 output
     for (int i = 0; i < list2.length; i++){
       System.out.print(list2[i] + " ");
     }
     System.out.println("");

   }
}

运行:

5 6 7 8 
1 2 3 4 
-1 2 3 -4 
-1 2 3 -4 
100 99
-1 2 3 -4 

3 个答案:

答案 0 :(得分:2)

列表1和列表2在执行List2 = list1;

后指向同一个数组对象

这样做List2 [3] = -4;实际上是为List1指向的数组对象做的。

并记住之前与List2相关的数组对象现在代表垃圾收集。

所以早些时候你做了List1 = x和List2 = y,在list1和list2变量指出的内存中有两个数组对象。但是在执行list2 = list1后,你使两个变量都指向x数组而另一个数组现在是免费的,并且java需要在某个时候重新收集这个内存,因此你所做的任何改变都是对象x而不是y

答案 1 :(得分:1)

当您在Java中执行list2 = list1;时,您实际上并未复制数组,而是复制对该数组的引用。

因此,内存中只有一个数组,listlist2都指向该数组。因此,对任何变量进行的任何修改也会影响另一个变量。

如果要创建数组的副本,请查看System.arraycopy方法。

答案 2 :(得分:0)

Java数组通过引用存储,因此在调用之后     list2 = list1; 两个变量都引用相同的数组。使用list2 = Arrays.copyOf(list1, list1.length)