文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何使用迭代器

2024-04-02 19:55

关注

本篇内容介绍了“如何使用迭代器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

阅读下面这段代码,请写出这段代码的输出内容:

import java.util.ArrayList; import java.util.Iterator; import java.util.*;  public class Test {     public static void main(String[] args) {          List<String> list = new ArrayList<>();         list.add("1");         list.add("2");         list.add("3");         Iterator iterator = list.iterator();         while (iterator.hasNext()) {             String str = (String) iterator.next();             if (str.equals("2")) {                 iterator.remove();             }         }         while (iterator.hasNext()) {             System.out.println(iterator.next());         }         System.out.println("4");     } }

他写出来的答案是:

1 3 4

奇怪的是,你把这道题目发给你身边人,让他们回答这道面试题输出结果是什么,说这个结果的人非常多。不行你试试。

答案明显不对,因为在第一个while里的  iterator.hasNext()==false后才会到第二个while里来,同一个Iterator对象,前面调一次iterator.hasNext()==false,再判断一次结果不还是一样吗?,

所以第二个while判断为false,也就不会再去遍历iterator了,由此可知本体答案是:4。

下面我们来分析一下为什么是具体底层是怎么实现的。

这里的Iterator是什么?

Iterator说明

public interface Iterator<E> {      //每次next之前,先调用此方法探测是否迭代到终点     boolean hasNext();     //返回当前迭代元素 ,同时,迭代游标后移     E next();           default void remove() {         throw new UnsupportedOperationException("remove");     }      default void forEachRemaining(Consumer<? super E> action) {         Objects.requireNonNull(action);         while (hasNext())             action.accept(next());     } }

这里的实现类是ArrayList的内部类Itr。

private class Itr implements Iterator<E> {         int cursor;       // index of next element to return         int lastRet = -1; // index of last element returned; -1 if no such         //modCountshi ArrayList中的属性,当添加或删除的时候moCount值会增加或者减少         //这里主要是给fail-fast使用,避免一遍在遍历,一遍正在修改导致数据出错         //此列表在结构上被修改的次数。结构修改是指改变结构尺寸的修改列表,         //或者以这样的方式对其进行扰动,进步可能会产生错误的结果。         int expectedModCount = modCount;                  public boolean hasNext() {             //cursor初始值为0,没掉一次next方法就+1             //size是ArrayList的大小             return cursor != size;         }          @SuppressWarnings("unchecked")         public E next() {             checkForComodification();             int i = cursor;             if (i >= size)                 throw new NoSuchElementException();             //把ArrayList中的数组赋给elementData             Object[] elementData = ArrayList.this.elementData;             if (i >= elementData.length)                 throw new ConcurrentModificationException();             //每调用一次next方法,游标就加1             //cursor=lastRet+1             cursor = i + 1;             //返回ArrayList中的元素             return (E) elementData[lastRet = i];         }          public void remove() {             if (lastRet < 0)                 throw new IllegalStateException();             checkForComodification();              try {                 //调用ArrayList中remove方法,溢出该元素                 ArrayList.this.remove(lastRet);                 //cursor=lastRet+1,                 //所以此时相当于cursor=cursor-1                 cursor = lastRet;                 lastRet = -1;                 expectedModCount = modCount;             } catch (IndexOutOfBoundsException ex) {                 throw new ConcurrentModificationException();             }         }         final void checkForComodification() {             if (modCount != expectedModCount)                 throw new ConcurrentModificationException();         } }

再回到上面题目中:

第一个iterator.hasNext()

第2次循环

第3次循环

第4次循环

第二个iterator.hasNext()

hasNext方法中:cursor==2, size==2,所以cursor !=  size返回false。

所以,最后只输出"4",即答案为4.

Iterator与泛型搭配

foreach和Iterator的关系

使用for循环还是迭代器Iterator对比

总结

“如何使用迭代器”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯