1

假设我有这部分代码。我有输出。所有值:[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], []]。当我将listOfValues2 设为clear() 时。我希望只清除该列表而不影响allValues列表中的值。我怎样才能做到?我需要这个,因为稍后我将使用另一个数据集生成另一个listOfValues2并将作为第三个列表放入allValues中。

     LinkedList<Integer> listOfValues1 = new LinkedList<Integer>();
     LinkedList<Integer> listOfValues2 = new LinkedList<Integer>();
     LinkedList<LinkedList<Integer>> allValues= 
     new LinkedList<LinkedList<Integer>>();

     for(int w=0; w<=10; w++) {
        listOfValues1.add(w);
     }

     for(int b=5; b<=15; b++) {
        listOfValues2.add(b);
     }

     allValues.add(listOfValues1);
     allValues.add(listOfValues2);
     listOfValues2.clear();
     System.out.println("allValues: " + allValues);
4

7 回答 7

6

我需要这个,因为稍后我将使用另一个数据集生成另一个 listOfValues2 并将作为第三个列表放入 AllValues 中。

那就不清楚了listOfValues2。稍后创建新LinkedList的并将其分配给listOfValues2变量。您对原始文件所做的任何更改也listOfValues2将发生在其中allValues,因为listOfValues2和第二个元素allValues共享对对象列表的相同引用。

于 2013-11-05T07:57:52.170 回答
3

在这种情况下,您需要这样做。

AllValues.add(new LinkedList<Integer>(listOfValues2)); // this will create a new list with all the values of listOfValues2

因为,如果您只添加listOfValues2,对其所做的任何更改也将反映在 中AllValues

于 2013-11-05T07:58:01.280 回答
2

集合类不是不可变的,因此不支持共享。因此,您不能按照您尝试的方式进行操作。如果您需要一个空列表,只需说:

listOfValues2 = new LinkedList<Integer>();
于 2013-11-05T07:57:58.640 回答
1

制作 listOfValues2 的副本。将其添加到 AllValues 而不是 listOfValues2。

于 2013-11-05T07:58:08.340 回答
1

您只需要使用您的clone()方法,LinkedList这样您就只会添加listOfValues2into的克隆AllValues

public class Main {

    public static void main(String[] args) {

        LinkedList<Integer> listOfValues1 = new LinkedList<Integer>();
        LinkedList<Integer> listOfValues2 = new LinkedList<Integer>();
        LinkedList<LinkedList<Integer>> AllValues = new LinkedList<LinkedList<Integer>>();

        for (int w = 0; w <= 10; w++) {
            listOfValues1.add(w);  
        }

        for (int b = 5; b <= 15; b++) {
            listOfValues2.add(b);  
        }

        AllValues.add(listOfValues1);

        // adding a cloned Linkedlist        
        AllValues.add((LinkedList<Integer> ) listOfValues2.clone());
        System.out.println("AllValues: " + AllValues);
        listOfValues2.clear();
        System.out.println("AllValues: " + AllValues);  
    }
}

这里的重点是当您创建列表的克隆时,AllValues将不再引用listOfValues2. listOfValues2因此,对列表的任何更新对AllValues.

于 2013-11-05T08:05:17.690 回答
0

然后,您应该将 listOfValues2 的副本放入 AllValues 或将另一个数据生成到第三个单独的列表中。

于 2013-11-05T08:01:40.620 回答
0

我认为链表总是引用内存而不是值。所以你清除 list2 然后那个特定的内存没有价值。allValue 列表再次引用相同的内存位置,不存在任何值。所以它为list2打印空。

于 2013-11-05T08:13:57.633 回答