- 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();
}
}