List list =new ArrayList();
list.add("asdfffff");
list.add("sx");
list.add("kkj");
list.add("r");
System.out.println("原list:" + list);
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
String item = iter.next();
if (item.equals("sx")) {
iter.remove();
}
}
System.out.println("删除元素后list:" + list);
运行结果:
原list:[asdfffff, sx, kkj, r]
删除元素后list:[asdfffff, kkj, r]
迭代器remove()方法虽然方便,但仍有需要注意的地方,要用此法删除元素的前提是该 List 的实现类的iterator()方法返回的Iterator实现类支持remove()方法,否则会报 java.lang.UnsupportedOperationException异常,常用的ArrayList的Iterator支持remove()方法,但有些情况下就会有问题,来看看以下代码:
Integer[] arr = {1, 2, 3, 4, 5};
List<Integer> list = Arrays.asList(arr);
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
Integer item = iter.next();
if (item == 2) {
iter.remove();
}
}
System.out.println("删除元素后list:" + list);
这种情况就会运行失败,报 java.lang.UnsupportedOperationException异常。
使用迭代器remove()方法还有需要注意的问题,接着看下面的代码:
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
iter.remove();
}
这个例子只是为了展示,比较极端,如果想用这种方法删除List所有元素,则会报java.lang.IllegalStateException异常,原因就是没有在删除前调用Iterator的next()方法。
还有一种变体,如下所示:
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
String item = iter.next();
if (item.equals("a") || item.equals("c")) {
list.remove(item);
}
}
注意,上面的代码调用了List的remove()而不是Iterator的remove(),如果只删除一个元素,那么在删除后调用break语句即可,但这里目的是删除多于1个的元素,会报java.util.ConcurrentModificationException异常。