subList()

89 阅读1分钟
  • subList()返回的并不是独立列表,与原列表有关联。
  • 操作subList也会影响原列表,需要断开两者关系。
  • subList可能导致空间占用过高,需要使用新列表保存结果。
  • 使用stream()或collect()获取子列表可以避免这些问题。
//wrong()方法中,subList()返回的列表与原列表有关联。
//从原列表中移除元素,subList也会受影响。
//向原列表添加元素,subList会抛出ConcurrentModificationException。
private static void wrong() {
    List<Integer> list = IntStream.rangeClosed(1, 10).boxed().collect(Collectors.toList());
    //从一个集合 list 中获取一个子列表 subList。
    List<Integer> subList = list.subList(1, 4);
    //打印 subList,内容为 [2, 3, 4]
    System.out.println(subList);
    //从 subList 中删除一个元素,也会影响到原列表 list
    subList.remove(1);
    System.out.println(list);//[1, 2, 4, 5, 6, 7, 8, 9, 10]
    list.add(0);//向 list 添加新元素,由于 list 已被修改,再次读取 subList 会抛出 ConcurrentModificationException。
    try {
        subList.forEach(System.out::println);
    } catch (Exception ex) {
        ex.printStackTrace();
    }

}