下面的代码实际修改了原始列表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]
答案 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个变量,即offset
和length
。这意味着没有实际的物理清单。因此,无论如何都不能通过更新子列表来更新原始列表。
您必须复制子列表才能达到您的要求。正如其他人在代码中所解释的那样。
来自javadocs
返回指定fromIndex(包含)和toIndex(独占)之间此列表部分的视图。 (如果fromIndex和toIndex相等,则返回的列表为空。)返回的列表由此列表支持,因此返回列表中的非结构更改将反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。