印象中循环删除 list 中的元素使用 for 循环的方式是有问题的, 但是可以使用增强的 for 循环, 然后今天在使用时发现报错了, 然后去科普了一下, 再然后发现这是一个误区. 下面就来讲一讲.. 伸手党可直接跳至文末. 看总结..
JAVA 中循环遍历 list 有三种方式 for 循环, 增强 for 循环 (也就是常说的 foreach 循环),iterator 遍历.
1,for 循环遍历 list
- for(int i=0;i<list.size();i++){
- if(list.get(i).equals("del"))
- list.remove(i);
- }
这种方式的问题在于, 删除某个元素后, list 的大小发生了变化, 而你的索引也在变化, 所以会导致你在遍历的时候漏掉某些元素. 比如当你删除第 1 个元素后, 继续根据索引访问第 2 个元素时, 因为删除的关系后面的元素都往前移动了一位, 所以实际访问的是第 3 个元素. 因此, 这种方式可以用在删除特定的一个元素时使用, 但不适合循环删除多个元素时使用.
2, 增强 for 循环
- for(String x:list){
- if(x.equals("del"))
- list.remove(x);
- }
这种方式的问题在于, 删除元素后继续循环会报错误信息 ConcurrentModificationException, 因为元素在使用的时候发生了并发的修改, 导致异常抛出. 但是删除完毕马上使用 break 跳出, 则不会触发报错.
3,iterator 遍历
- Iterator<String> it = list.iterator();
- while(it.hasNext()){
- String x = it.next();
- if(x.equals("del")){
- it.remove();
- }
- }
这种方式可以正常的循环及删除. 但要注意的是, 使用 iterator 的 remove 方法, 如果用 list 的 remove 方法同样会报上面提到的 ConcurrentModificationException 错误.
总结:
(1) 循环删除 list 中特定一个元素的, 可以使用三种方式中的任意一种, 但在使用中要注意上面分析的各个问题.
(2) 循环删除 list 中多个元素的, 应该使用迭代器 iterator 方式.
来源: http://www.bubuko.com/infodetail-2762476.html