Java集合Iterator

日常用迭代器用的很少,最近做一个数据筛选的轮询操作。也是发现了对迭代器认识度太低.

学习了学习了。

当前想把数据集有某个指定特征的数据过滤掉,先是直接想到用list的remove 但是结果却是删除一个后抛出ConcurrentModificationException异常,得出结论list不能一边轮询一边删除..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
List<String> list = new ArrayList<>();
list.add("2");
list.add("2");
list.add("1");
list.add("1");
list.add("1");
try {
for (String str : list) {

if (str.equals("1")) {
list.remove(str);
}
}
} catch (ConcurrentModificationException e) {
System.out.println("无法删除");
}
System.out.println("使用list删除后" + list.size());

然后想到使用迭代器

1
2
3
4
5
6
7
Iterator<String> iterator;
for (iterator = list.iterator(); iterator.hasNext(); ) {
if (iterator.next().equals("1")) {
iterator.remove();
}
}
System.out.println("使用iterator删除后 list长度" + list.size());

之前的删除操作是完美解决了。问题随之出现 本想着 list.iterator(); 属于一个属性 付给了这个迭代器,最后的结果应该是不会影响原本list的,然而。。。

image-20200906024806764

这说明 list.iterator().remove() 与list.remove(obj) 并无原则上的差异,只是处理的细节不同

对iterator的remove是对list直接生效的。

后面又发现一个问题,我想存储未改动的结果集 需要如此

1
List<String> list2=new ArrayList(list);

而不是

1
List<String> list2=List;