java ArrayList中modCount的作用
2021-02-13 11:18
阅读:432
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test2 { public static void main(String[] args) { Listlist = new ArrayList (); list.add("a"); list.add("b"); list.add("c"); Iterator iterator = list.iterator(); while(iterator.hasNext()){ String str = iterator.next(); list.remove(str); } } }
以上代码执行后抛异常
Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) at com.design.mode.Test2.main(Test2.java:15)
符合注释上的说明,既然说是由迭代器使用,那再看看迭代器代码(删除了不相干代码)
/** * 这里可以看出 迭代器是 ArrayList 的一个内部实现类 典型的迭代器模式 */ public Iteratoriterator() { return new Itr(); } /** * An optimized version of AbstractList.Itr */ private class Itr implements Iterator { int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such // 这里将 modCount 赋值给了 expectedModCount int expectedModCount = modCount; Itr() {} public boolean hasNext() { return cursor != size; } @SuppressWarnings("unchecked") public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } public void remove() { if (lastRet ) throw new IllegalStateException(); checkForComodification(); try { this.remove(lastRet); cursor = lastRet; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } final void checkForComodification() { // 若修改后 modCount会变化 会与 expectedModCount 数值不相等 if (modCount != expectedModCount) throw new ConcurrentModificationException(); } }
看源码可以得出获取迭代器时会将 expectedModCount 赋值为 modCount, 若在使用迭代器迭代期间修改列表则会导致两者不相等,调用next()时会进行checkForComodification检查抛异常。说明迭代时不可以进行修改操作。
modCount主要目的就是用来限制用户在迭代时修改列表,造成数据错乱
上一篇:使用python解压rar文件
下一篇:4.K均值算法--应用
文章来自:搜素材网的编程语言模块,转载请注明文章出处。
文章标题:java ArrayList中modCount的作用
文章链接:http://soscw.com/index.php/essay/54837.html
文章标题:java ArrayList中modCount的作用
文章链接:http://soscw.com/index.php/essay/54837.html
评论
亲,登录后才可以留言!