【问题标题】:To Unequal two list when defined equal beforeTo Unequal two list when defined equal before
【发布时间】:2018-03-08 07:38:47
【问题描述】:
ArrayList<Integer> list1= new ArrayList<>();
ArrayList<Integer> list2= new ArrayList<>();
for(int i=1;i<=5;i++){
list1.add(i);
}
System.out.println("List1 "+list1);
list2=list1;
System.out.println("List2 "+list2 );
list2.add(6);
System.out.println("List1 Changed "+list1 );

输出:

List1 [1, 2, 3, 4, 5]
List2 [1, 2, 3, 4, 5]
List1 Changed [1, 2, 3, 4, 5, 6]

我知道使用 list2=list1,并且在更改 list2 时,list1 也会被更改。但我不希望我的 list1 改变它。我必须使用 list2=list1,但是有什么方法可以让我只获得 List1 [1, 2, 3, 4, 5] 吗?

【问题讨论】:

  • list1 的克隆分配给list2
  • @JeroenSteenbeeke:这里没有向任何方法传递任何内容。
  • @Thilo 确实是,但参考正在更改,所以我认为它可能有助于解释问题

标签: java arrays list arraylist


【解决方案1】:

如果您希望 list2 引用与 list1 不同的 List,请复制:

改变

list2=list1;

list2 = new ArrayList<>(list1);

请注意,由于您正在覆盖对 list2 引用的原始 List 的引用,因此无需首先创建它:

ArrayList<Integer> list1 = new ArrayList<>();
for(int i = 1; i <= 5; i++) {
    list1.add(i);
}
System.out.println("List1 "+list1);
ArrayList<Integer> list2 = new ArrayList<>(list1);
System.out.println("List2 "+list2);
list2.add(6);
System.out.println("List1 Not Changed "+list1);

【讨论】:

  • 有一种方法可以做同样的事情,而不是创建新的对象。
  • @ꜱᴜʀᴇꜱʜᴀᴛᴛᴀ 是的,但该声明也旨在替换 ArrayList&lt;Integer&gt; list2= new ArrayList&lt;&gt;(); 声明。
【解决方案2】:
list2=list1;

您正在使用 list1 引用覆盖 list2。如果您想将它们分开,只需添加它们,不要分配

list2.addAll(list1);

【讨论】:

    【解决方案3】:

    您可以复制该列表,而不仅仅是为其分配引用:

    list2 = new ArrayList<>(list1);
    

    【讨论】:

      【解决方案4】:

      list1list2 是变量,它们都是对ArrayList&lt;Integer&gt; 类型对象的引用。在执行list2 = list1 之后,它们的值完全相同,该值是对象的地址,而不是对象本身。这意味着此时您丢失了 list2 指向的原始列表,并且您有两个变量指向内存中的同一位置。

      要保留两个独立的列表,您可以做的是添加从 list1list2 的元素,像这样

      List<Integer> list2 = new ArrayList<>(list1);
      

      或者这个:

      List<Integer> list2 = new ArrayList<>();
      /*code inbetween*/
      list2.addAll(list1);
      

      【讨论】:

        【解决方案5】:
            ArrayList<Integer> list1= new ArrayList<>();
            ArrayList<Integer> list2= new ArrayList<>();
            for(int i=1;i<=5;i++){
            list1.add(i);
            }
            System.out.println("List1 "+list1);
            list2=(ArrayList<Integer>) list1.clone();
            System.out.println("List2 "+list2 );
            list2.add(6);
            System.out.println("List1 Changed "+list1 );
        

        【讨论】:

          猜你喜欢
          • 2022-12-01
          • 2022-12-27
          • 2022-12-01
          • 2018-12-26
          • 2021-03-09
          • 2022-12-01
          • 1970-01-01
          • 2012-11-21
          • 2022-04-20
          相关资源
          最近更新 更多