子列表没有修改java中的原始列表

时间:2013-11-27 16:38:14

标签: java

下面的代码实际修改了原始列表x。考虑到对子列表的修改不应该修改原始列表,是否有子列表主列表?

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

x.add(1);
x.add(2);
x.add(3);
x.add(4);
x.add(5);

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

y.add(1);
y.add(2);
y.add(3);

final List<Integer> z = x.subList(0, 4);

System.out.println("sublist " + z.toString());

z.removeAll(y);

System.out.println("Main list after removing sublist " + x.toString());

结果:

sublist [1, 2, 3, 4]
Main list after removing sublist [4, 5]

6 个答案:

答案 0 :(得分:6)

尝试使用List<Integer> z = new ArrayList<>(x.subList(0, 4))

   List<Integer> x = new ArrayList<Integer>();
    x.add(1);
    x.add(2);
    x.add(3);
    x.add(4);
    x.add(5);

    List<Integer> y = new ArrayList<Integer>();
    y.add(1);
    y.add(2);
    y.add(3);

    final List<Integer> z = new ArrayList<>(x.subList(0, 4));

    System.out.println("sublist " + z.toString());

    z.removeAll(y);

    System.out.println("Main list after removing sublist " + x.toString());

<强>输出:

sublist [1, 2, 3, 4]
Main list after removing sublist [1, 2, 3, 4, 5]

答案 1 :(得分:5)

如果您不希望子列表成为原始文件的“窗口”,则需要制作副本,如下所示:

final List<Integer> z = new ArrayList<Integer>(x.subList(0, 4));

如果您希望在不制作副本的情况下拥有不可修改的列表,则可以使用Collections.unmodifiableList

final List<Integer> z = Collections.unmodifiableList(x.subList(0, 4));
z.removeAll(y); // <<== This will now fail.

答案 2 :(得分:0)

是的,作业

        final List<Integer> z = x.subList(0, 4);

只会将x(这是一个引用)的值复制到z,因为您尚未创建新对象。它们都会引用同一个对象。因此,无论您在任何一个列表中进行任何更改,相同的更改也会反映在另一个列表中

这是你应该做的: -

List<Integer> z = new ArrayList<Integer>(//your sublist code);

答案 3 :(得分:0)

为什么不使用CopyOnWriteArrayList

表单文档:

  

ArrayList的线程安全变体,其中包含所有可变操作   (添加,设置等)是通过制作新的副本来实现的   底层数组。

final List<Integer> z = new Arraylist<Integer>(x.subList(0, 4));

答案 4 :(得分:0)

使用构造函数创建一个新列表,该构造函数复制新列表中的所有子列表元素。

final List<Integer> z = new Arraylist<Integer>(x.subList(0, 4));

答案 5 :(得分:0)

子列表是主列表中的一种视图。如果您使用某个Collection调试程序,则会为子列表找到2个变量,即offsetlength。这意味着没有实际的物理清单。因此,无论如何都不能通过更新子列表来更新原始列表。

您必须复制子列表才能达到您的要求。正如其他人在代码中所解释的那样。

来自javadocs

  

返回指定fromIndex(包含)和toIndex(独占)之间此列表部分的视图。 (如果fromIndex和toIndex相等,则返回的列表为空。)返回的列表由此列表支持,因此返回列表中的非结构更改将反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。