有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中向列表集合添加列表

List<List<Integer>> list = new LinkedList<List<Integer>>();
List<Integer> tmp = new LinkedList<Integer>();
tmp.add(2);
list.add(tmp);
tmp.add(3);
list.add(tmp);

列表的结果是[[2,3],[2,3]];我只是不明白为什么它不是[[2],[2,3]]。当我使用list.add(new LinkedList<Integer>(tmp))时,它会起作用。我打印tmp,它仍然是[2], [2,3],它没有改变。为什么会这样? 先谢谢你


共 (2) 个答案

  1. # 1 楼答案

    Java使用对使用new创建的对象的引用来引用这些对象。在本例中,变量tmp实际上是对堆上LinkedList对象的引用

    因为list是一个对象列表,它实际上是一个对这些对象的引用列表。在本例中,它的两个元素是对同一堆对象的引用,tmp

  2. # 2 楼答案

    您将对tmp的引用添加到了list。添加时,tmp仅包含[2,3]。在添加到list之后,您向tmp的同一引用添加了3。这导致两个“副本”都有[2,3]

    一种方法是创建一个新列表并执行以下操作

    tmp = new LinkedList<Integer>();
    tmp.add(3);
    list.add(tmp);
    

    现在,列表看起来像[[2],[3]]

    如果希望列表为[[2],[2,3]]

    List<List<Integer>> list = new LinkedList<List<Integer>>();
    List<Integer> tmp = new LinkedList<Integer>();
    tmp.add(2);
    
    // add a copy of this linkedlist to the "BIG" list
    list.add(new LinkedList<Integer>(tmp));
    tmp.add(3);
    list.add(tmp);
    

    如果有什么不清楚,请告诉我