Iterator解决List删除元素漏删情况

前言

本人在从事java初期,在需要删除List当中元素的时候都是用for循环遍历集合来删除当中的元素,后来经人指点得知这种删除指定元素的方式似乎不太安全。

开始

问题

看如下删除元素示例

1
2
3
4
5
6
List<String> ls = new ArrayList<String>();
ls.add("aa");
ls.add("bb");
ls.add("cc");
ls.add("aa");
ls.add("aa");
1
2
3
4
5
6
7
System.out.println("这是删除之前的ls"+ls);//删除之前的ls
for(int i=0;i<ls.size();i++){
if("aa"==ls.get(i)){
ls.remove(i);
}
}
System.out.println("这是删除之前的ls"+ls);//删除之后的ls

控制台输出如下

这似乎不是我们想要的结果。导致上面的原因是在ls删除某个元素之后,ls的大小随之发生变化,而你的索引也在变化,删除元素之后的元素都往前移动了一位,这就导致了漏删掉一些元素。

用Iterator解决问题

1
2
3
4
5
6
7
8
9
System.out.println("这是删除之前的ls"+ls);
Iterator<String> iterator = ls.iterator();
while(iterator.hasNext()){
String str = iterator.next();
if("aa".equals(str)){
iterator.remove();
}
}
System.out.println("这是删除之后的ls"+ls);

控制台输出如下

这正是我们想要的结果

1
Iterator<String> iterator = ls.iterator();

上面代码将ls的引用传递给iterator对象,由iterator对象来做删除操作,让这个操作变得安全。

总结

其实第一眼看到iterator来删除对象时候是比较疑惑的,因为在iterator遍历完之后并没有将值赋给List,其实Iterator iterator = ls.iterator() 这句是将List的引用传递给Iterator对象所以并不存在赋值过去的说法。

0%