前言
今天是1024节日,首先和大家说声节日快乐哈,也好久没更新过博客了,从去年停更以来这段时间确实经历了很多事情,也就是我从一个学生慢慢转变为一个职场人的过程,以后有机会的话可以和大家分享这段时间的经历。
正文
回到正题,今天主要和大家分享一个我之前在工作中遇到的一个异常。
java.util.ConcurrentModificationException
emm…
大家是不觉得稍微有点陌生,没关系,上代码,大家来看看这个异常是如何产生的。
List<String> list = new ArrayList<>();
list.add("abc");
list.add("abcd");
list.add("abcde");
list.add("abcdef");
//需求:删除集合中字符串长度等于4的元素
for (String str : list) {
if (str.length() == 4) {
list.remove(str);
}
}
简单和大家说下原因吧:我们在对集合进行foreach循环的时候,会对modCount和expectedModCount两个值进行比较。因为在遍历集合的过程中进行了删除元素的操作,导致两个值不相等,所以报了这个异常。
这个的话大家去看下ArrayList源码就很清晰了,喏,下面就为你们准备好了源码。
多贴心。。。。
public void forEach(Consumer<? super E> action) {
Objects.requireNonNull(action);
final int expectedModCount = modCount;
@SuppressWarnings("unchecked")
final E[] elementData = (E[]) this.elementData;
final int size = this.size;
for (int i=0; modCount == expectedModCount && i < size; i++) {
action.accept(elementData[i]);
}
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
好了,原因我们也了解过了,接下来就交大家如何去解决,毕竟需求还是在的嘛。
这里我就讲一个最简单的方法吧!
jdk在1.8为我们提供了一个removeIf()方法,专用于遍历集合过程中删除特定的元素,具体操作如下。具体jdk是如何解决的,大家也可以去看一下源码,这里我就不过多探讨了。
List<String> list = new ArrayList<>();
list.add("abc");
list.add("abcd");
list.add("abcde");
list.add("abcdef");
//需求:删除集合中字符串长度等于4的元素
list.removeIf(i -> i.length()==4);
总结
怎么说呢,比较水,哈哈,但也算是自己的一个小心得吧!
祝大家节日快乐,我们下期见。