JAVA编码中存在一些容易被人忽视的陷阱,稍不留神可能就会跌落其中,给项目的稳定运行埋下隐患。此外,这些陷阱也是面试的时候面试官比较喜欢问的问题。
本文对这些陷阱进行了统一的整理,让你知道应该如何避免落入陷阱中,下面就一起来了解下吧。
循环中操作目标list
遍历List然后对list中符合条件的元素进行删除操作,这是项目里面非常常见的一个场景。
先看下两种典型的错误写法:
错误写法1:
for (User user : userList) {
if ("男".equals(user.getSex())) {
userList.remove(user);
}
}
错误原因:
在循环或迭代时,会首先创建一个迭代实例,这个迭代实例的 expectedModCount
赋值为集合的 modCount
。而每当迭代器使⽤ hashNext()
/ next()
遍历下⼀个元素之前,都会检测 modCount
变量与 expectedModCount
值是否相等,相等的话就返回遍历;否则就抛出异常 ConcurrentModificationException
,终⽌遍历。
如果在循环中添加或删除元素,是直接调用集合的 add()
, remove()
方法,导致了 modCount
增加或减少,但这些方法不会修改迭代实例中的 expectedModCount
,导致在迭代实例中 expectedModCount
与 modCount
的值不相等,抛出ConcurrentModificationException异常。
错误写法2:
for (int i = 0; i < userList.size(); i++>) { if ("男".equals(user.getSex())) { userList.remove(i); } }
错误原因:
删除元素之后,元素下标发生前移,但是指针是不变的,再处理下一个的时候,就可能会有部分元素被漏掉没有处理。
那正确的方式应该如何处理呢?接着往下看。
正确写法1:
// 使用迭代器来实现 Iterator iterator = userList.iterator(); while (iterator