怎么做有趣视频网站,竞价托管哪家公司好,莱州网络建站,架设网站多少钱文章目录 1. Iterator和ListIterator1.1 简介1.2 常用方法 2. remove方法2.1 比较foreach方式和迭代器方式删除元素2.2 找原因 -- 迭代器删除操作源码 1. Iterator和ListIterator
1.1 简介
1.Iterator 可以遍历List集合#xff0c;也可以遍历Set集合#xff1b; ListIterat… 文章目录 1. Iterator和ListIterator1.1 简介1.2 常用方法 2. remove方法2.1 比较foreach方式和迭代器方式删除元素2.2 找原因 -- 迭代器删除操作源码 1. Iterator和ListIterator
1.1 简介
1.Iterator 可以遍历List集合也可以遍历Set集合 ListIterator只能遍历List集合
2.Iterator 只能单向遍历向后遍历ListIterator双向遍历向前/向后遍历
3.ListIterator继承Iterator接口添加新的方法
1.2 常用方法 add(E e):将指定的元素插入到集合中插入位置为迭代器当前位置之前 hasNext():正向遍历集合判断后面是否还有元素返回boolean类型值 next():返回集合中迭代器指向后面位置的元素 nextIndex():返回集合中迭代器后面位置元素的索引 hasPrevious():反向遍历集合判断前面是否还有元素返回boolean类型值 previous():返回集合中迭代器指向前面位置的元素 previousIndex():返回集合中迭代器前面位置元素的索引 set(E e):替换迭代器当前位置的元素 ListString listnew ArrayList();list.add(aa);list.add(bb);list.add(cc);list.add(dd);for (IteratorString iterator list.iterator();iterator.hasNext();){System.out.println(iterator.next());}ListString listnew ArrayList();list.add(aa);list.add(bb);list.add(cc);list.add(dd);//正向遍历ListIteratorString iteratorlist.listIterator();iterator.add(EEE);for (String s : list) {System.out.println(s);//EEE aa bb cc dd}ListString listnew ArrayList();list.add(aa);list.add(bb);list.add(cc);list.add(dd);ListIteratorString iteratorlist.listIterator();iterator.next();iterator.add(EEE);for (String s : list) {System.out.println(s);//aa EEE bb cc dd}System.out.println(-------------------);iteratorlist.listIterator();for (;iterator.hasNext();){System.out.println(iterator.next());}System.out.println(-------------------);iteratorlist.listIterator();for (;iterator.hasNext();){System.out.println(iterator.nextIndex()\titerator.next());}运行结果
//反向遍历ListIteratorString iteratorlist.listIterator(list.size());while (iterator.hasPrevious()) {System.out.println(iterator.previousIndex()\titerator.previous());}运行结果 ListIteratorString iteratorlist.listIterator(list.size());while (iterator.hasPrevious()) {System.out.println(iterator.previousIndex()\titerator.previous());}iterator.set(GGG);System.out.println(list);//[GGG, bb, cc, dd]
----------------------------------------------------------------------------ListIteratorString iteratorlist.listIterator(list.size());iterator.previous();iterator.set(GGG);while (iterator.hasPrevious()) {System.out.println(iterator.previousIndex()\titerator.previous());}System.out.println(list);//[aa, bb, cc, GGG]2. remove方法
2.1 比较foreach方式和迭代器方式删除元素
对集合元素进行循环处理增加或删除时不能使用foreach处理方式要使用迭代器方式。
使用foreach方法进行删除报错java.util.ConcurrentModificationException ArrayListString listnew ArrayList();list.add(aaa);list.add(bbb);list.add(ccc);list.add(ddd);for (String s : list) {if (aaa.equals(s)){list.remove(s);}}System.out.println(list);使用迭代器方式删除元素 IteratorString iteratorlist.iterator();while (iterator.hasNext()){String xiterator.next();if (x.equals(aaa)){iterator.remove();}}System.out.println(list);//[bbb,ccc,ddd]但是在foreach对集合中倒数第二个元素进行删除时不会报错其他位置的元素都会报错。 for (String s : list) {if (ccc.equals(s)){list.remove(s);}}System.out.println(list);//[aaa,bbb,ddd]其中foreach底层也是通过迭代器实现的。
其实我们在使用迭代器操作时有两个步骤
iterator.hasNext();//判断是否有下一个元素itemiterator.next();//有下一个元素的话取出2.2 找原因 – 迭代器删除操作源码 首先我们进入到Iterator的remove()方法中找到Itr类在这个类中我们会看到ArrayList的remove()方法 在remove()方法中看到里面有个checkForComodification()方法 final void checkForComodification() {if (modCount ! expectedModCount)throw new ConcurrentModificationException();}在checkForComodification()方法中有两个变量modCount变量和expectedModCount变量当这两个变量不相同时就会抛出异常处理也就是我们在前面遇到的那个异常 modCount变量:记录集合对象从new出来到现在被修改的次数expectedModCount变量:迭代器现在期望这个集合被修改的次数在上面源码中看到expectedModCount modCount;只要保持这两个变量相等删除操作就没有问题。 所以迭代器不会报错使用foreach会报错原因是 在迭代器中对这两个变量进行了同步处理而foreach没有进行同步处理导致会出现checkForComodification异常出现。 通过查看源码有一个hasNext()方法方法中要比较cursor和size public boolean hasNext() {return cursor ! size;}cursor是下一个元素的索引值size是整个集合元素个数
如果两个元素不相等即有下一个元素就返回true。
当删除倒数第二个元素时cursor通过计算之后得到cursorsize导致迭代器认为不存在下一个元素迭代结束。
整体架构如下