Java面试题-遍历中从List中删除一个元素
列表List是Java中的一种数据结构,存放按照添加顺序的元素,是个有序的集合。面试中常常被问到,效率,实现方式以及怎么在遍历中删除一个元素。本文就来实现在遍历中删除一个元素。
1、for循环中删除一个元素,正序删除一个元素
正序删除一个元素
这种删除一个元素没有问题,但如果还有其他业务逻辑的时候,会少处理一个元素,因为数据的索引变了,怎么解决?最简单的方式就是添加i--,代码如下:
解决少元素问题
2、for循环中删除一个元素,倒叙删除一个元素,倒叙删除元素的时候,没有上面的问题,因为要处理的元素的索引没变。
倒序删除一个元素
3、用迭代删除一个元素,先看看下面的代码是否有问题?
迭代中删除一个元素
如果运行这个代码,会抛出一个异常ConcurrentModificationException,原因就是用list的remove删除元素时,只改变了modCount,然而Iterator中的next方法中会检查modCount和expectedModCount是否一致,如果不一致就会抛出异常。我们可以用Iterator的remove方法,
删除一个元素
4、foreach是否可以删除元素?
foreach删除一个元素
这段代码也会抛出ConcurrentModificationException异常,因为foreach会在编译的时候转成Iterator,我们反编译下代码,
反编译后代码
从编译后的代码看,foreach被转成了Iterator,这就和Iterator遍历时用list的remove删除元素一样的问题。
如果删除完直接break,也能删除元素,这样就只能删除一个元素。