为什么subList和addAll之后的结果会如此奇怪?

时间:2014-07-23 13:23:12

标签: java

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

    rest.subList(0, 1);
    rest.subList(1, 3);

    println(rest);

    int i = 1;
    List<Integer> newRest = rest.subList(0, i);
    newRest.addAll(rest.subList(i + 1, rest.size()));

    println(rest);

println是打印列表的方法,为什么第一个println将打印[1,2,3],但第二个println将打印[1,3,2,3]

2 个答案:

答案 0 :(得分:2)

您可以在subList()的javadoc中看到解释:

  

...返回的列表由此列表支持,因此返回列表中的非结构更改将反映在此列表中,反之亦然......

换句话说,将一个元素添加到子列表中也会将其添加到原始列表中。

答案 1 :(得分:1)

正如您可以在官方Java文档中看到的那样:

  

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

在您的代码中,newRest包含对rest的引用,因此当您向newRest添加项目时,您还将它们添加到原始列表中。这样做的正确方法是使用新的ArrayList()初始化newRest:

  List<Integer> newRest = new ArrayList<Integer>();
    newRest.addAll(rest.subList(0, i));
    newRest.addAll(rest.subList(i + 1, rest.size()));

希望这会对你有所帮助。