【问题标题】:java - list question - Why did it print out -4 on the 3rd printout when i ran it?java - 列表问题 - 为什么在我运行它时它在第三次打印输出时打印出 -4?
【发布时间】:2010-09-25 10:05:25
【问题描述】:
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 

【问题讨论】:

  • 你的第一条线索是什么?你有一个调试器允许你单步调试你的代码吗?
  • 我有netbean?我没有线索,因为它说 for (int i = 0; i
  • list2 = list1;用于之前的“for”循环,并且已经关闭。那么它还应该影响它吗?

标签: java arrays list


【解决方案1】:

在您执行 List2 = list1; 之后,List 1 和 List 2 指向同一个数组对象

这样做 List2[3] = -4;实际上是对 List1 之前指向的数组对象执行此操作。

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

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

【讨论】:

  • 因此,如果您以后以任何方式更改 list2 的形状或形式。您基本上是在更改 list1 ,因为它们引用的是同一点?对吗?
  • 是的,你是对的。唯一需要澄清的是内存中有对象,然后有指向这些对象的变量,所以下次查找变量指向的位置。
【解决方案2】:

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

所以你在内存中只有一个数组,你的listlist2 都指向那个数组。因此,对任何变量所做的任何修改都会影响另一个变量。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2022-10-14
      • 1970-01-01
      • 2022-11-21
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      相关资源
      最近更新 更多