日常用迭代器用的很少,最近做一个数据筛选的轮询操作。也是发现了对迭代器认识度太低.
学习了学习了。
当前想把数据集有某个指定特征的数据过滤掉,先是直接想到用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的,然而。。。

这说明 list.iterator().remove() 与list.remove(obj) 并无原则上的差异,只是处理的细节不同
对iterator的remove是对list直接生效的。
后面又发现一个问题,我想存储未改动的结果集 需要如此
1
| List<String> list2=new ArrayList(list);
|
而不是
1
| List<String> list2=List;
|