【问题标题】:Original ArrayList changes when I use new operator当我使用 new 运算符时,原始 ArrayList 发生了变化
【发布时间】:2016-11-23 02:04:41
【问题描述】:

我遇到了问题。结果在我尝试更改以下代码中的温度时更新(我对结果没有做任何事情):

List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList<>());
List<List<Integer>> temp = new ArrayList<>();
for (List<Integer> list: result) {
    list.add(10000);
    temp.add(new ArrayList(list));
}

我不知道为什么结果是 [[10000]] 以及温度。像 temp.add(new ArrayList(list)) 这样的 add 方法有什么问题吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    所写的代码只循环一次。一起来看看吧:

    List<List<Integer>> result = new ArrayList<>();
    result.add(new ArrayList<>());
    

    这会初始化result,这是一个List,其元素是List&lt;Integer&gt;。然后将一个元素添加到结果中,因此 result 是一个单元素列表。该元素本身就是一个零元素列表。

    List<List<Integer>> temp = new ArrayList<>();
    

    在这里,您将 temp 初始化为包含 List&lt;Integer&gt; 作为其元素类型的 List,但它是空的。

    for (List<Integer> list: result) {
        list.add(10000);
        temp.add(new ArrayList(list));
    }
    

    注意这里,result 只有一个元素。那一个元素就是你在第 2 行给它的东西,result.add(new ArrayList&lt;&gt;());。此循环将针对result 的每个元素进行迭代,这将导致它仅循环一次,因为result 只有一个元素。

    发生这种情况时,result 的第一个元素将更新为包含10000 的列表,而不是一个空列表。所以result 仍然是一个单例列表,但它的一个元素现在也将是一个包含10000 的单例列表。

    然后您拨打temp.add(new ArrayList(list))。调用new ArrayList(list) 会创建一个ArrayList,其中包含list 所做的所有元素。当你调用它时,list 是一个包含 10000 的单例,所以 new ArrayList(list) 也是一个只包含数字 10000 的单例。然后,将 ArrayList 添加到 temp,这之前是一个空列表。现在,temp 是一个单例,它的一个元素是一个包含10000 的单例列表。

    此时,resulttemp 都是只包含一个元素的列表,每个列表都是一个只包含一个元素的列表,即数字10000。这就是为什么resulttemp 的值是[[10000]],其中[10000] 是一个仅包含数字10000 的列表,而[[10000]] 是一个仅包含[10000] 的列表。

    【讨论】:

      猜你喜欢
      • 2012-03-25
      • 2013-05-13
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      相关资源
      最近更新 更多