在iterator内部直接用集合自身的remove会导致错误异常(add也可以借鉴)
解决方法
第一种:直接调用iterator自带的remove方法,需要注意的是一次next方法后面只能调用一次remove
void remove()
- 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的 collection,则迭代器的行为是不确定的。
-
-
抛出:
-
UnsupportedOperationException
- 如果迭代器不支持 remove 操作。 -
IllegalStateException
- 如果尚未调用 next 方法,或者在上一次调用 next 方法之后已经调用了 remove 方法。
-
package collect; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class myiterator { public static void main(String[] args) { List<String> list =new ArrayList<String>(); list.add("China"); list.add("hello"); list.add("world"); Iterator<String> it =list.iterator(); System.out.println(list.size()); System.out.println("开始前集合的内容:"+list); int i = 0,j=0; while (it.hasNext()) { it.next(); i++; it.remove(); System.out.println("运行第"+i+"次"); System.out.println("remove后集合剩:"+list); } System.out.println("集合最后:"+list); } }
结果正常,假如上面有多个it.remove(); 就会报错IllegalStateException
3
开始前集合的内容:[China, hello, world]
运行第1次
remove后集合剩:[hello, world]
运行第2次
remove后集合剩:[world]
运行第3次
remove后集合剩:[]
集合最后:[]
it.remove()操作删除的是上一次next元素获取的对象也就是(it.next这个对象)。如果要通过迭代器删除一个元素,首先要通过next方法获取该元素。所以也是api里面讲的一个next方法跟一个remove方法,多了会报错(如果删除一次,it.next获取的对象已经被删除了,再进行一次删除操作肯定报错)
第二种:利用另外的list2,将需要remove的值存入另外的list2中,最后用原来的list.removeALL(list2)就可以完成
这种方法forEach也可以用
package collect; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class myiterator { public static void main(String[] args) { List<String> list =new ArrayList<String>(); list.add("China"); list.add("hello"); list.add("world"); Iterator<String> it =list.iterator(); System.out.println(list.size()); System.out.println("list开始前集合的内容:"+list); List<String> list2 =new ArrayList<>(); while (it.hasNext()) { String st=it.next(); list2.add(st); } System.out.println("list2最后得到的集合"+list2); list.removeAll(list2); System.out.println("list集合remove最后:"+list); } }
结果
3
list开始前集合的内容:[China, hello, world]
list2最后得到的集合[China, hello, world]
list集合remove最后:[]
for-each的写法,使我们无法获得iterator对象,所以无法直接用遍历方式进行删除操作,但是上面这种可以使用
下面这种也可以
package collect; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class myiterator { public static void main(String[] args) { List<String> list =new ArrayList<String>(); list.add("China"); list.add("hello"); list.add("world"); Iterator<String> it =list.iterator(); System.out.println(list.size()); System.out.println("list开始前集合的内容:"+list); for (Iterator it1 = list.iterator(); it1.hasNext();) { String jihe = (String) it1.next(); it1.remove(); } System.out.println("list集合remove最后:"+list); } }
结果
3
list开始前集合的内容:[China, hello, world]
list集合remove最后:[]