迭代器的引出

在jdk1.5版本之前是没有 foreach的,然而1.5版本就加上了foreach,而引入的新的foreach功能并不是在jvm上进行改进的因为代价太高,甲骨文工程师想到了一个比较好的办法就是在编译器中引入迭代器的概念从而实现foreach遍历。

请看一段代码:

//     功能 使用HashSet存储、删除、遍历 几个学生的信息HashSet<Student> hash = new HashSet<Student>();hash.add(new Student("张三", 20));hash.add(new Student("李四", 21));hash.add(new Student("王二", 22));hash.add(new Student("麻子", 23));String st1 = "hello";String st2 = "hello";String st3 = st2;System.out.println(st1 == st3);//       删除一个姓名为张三的学生String name1 = "张三";boolean flag = true;for (Student student : hash) {String name2 = student.getName();if(name1 == name2){hash.remove(student);flag = false;break;}}if(flag){System.out.println("不存在");}for (Student s : hash) {System.out.println(s);}

而上面的代码在运行多次的时候会出现下列错误异常:

这个错误是在遍历集合的同时删除了集合中的数据,这种写法不保证线程安全

怎么解决?上面的写法是不同的人做了不同的事   解决办法就是让一个人即遍历又删除   这就引出了 迭代器

先看下迭代器的简单用法:

我先把迭代器比作导游 集合里存的都是景点

请看上面的红色箭头是从最开始位置出现 然后通过迭代器的next()一个个往下找

//       迭代器的用法//        1、创建集合ArrayList<String> al = new ArrayList<String>();al.add("张三");al.add("李四");al.add("王二");//       创建迭代器对象  注意这里创建迭代器不是用new  而是用集合的方法Iterator<String> it = al.iterator();while(it.hasNext()){String s = it.next();System.out.println(s);}

改写异常之后的写法:

//      功能 使用HashSet存储、删除、遍历 几个学生的信息HashSet<Student> hash = new HashSet<Student>();hash.add(new Student("张三", 20));hash.add(new Student("李四", 21));hash.add(new Student("王二", 22));hash.add(new Student("麻子", 23));String st1 = "hello";String st2 = "hello";String st3 = st2;System.out.println(st1 == st3);//       删除一个姓名为张三的学生String name1 = "张三";boolean flag = true;Iterator<Student> it = hash.iterator();while(it.hasNext()){Student s = it.next();if(name1.equals(s.getName())){it.remove();flag = false;break;}}if(flag){System.out.println("不存在");}for (Student s : hash) {System.out.println(s);}

迭代器的底层原理

根据图所示 为达到方法的统一性所有集合都是实现了Interable接口 通过实现接口的方法创建并返回一个Iterator对象

然后通过创建内部类实现Iterator 里所有的方法最终目的是为了统一所有集合中的方法名称一样

转载于:https://www.cnblogs.com/nianzhilian/p/8923256.html

java的迭代器详解相关推荐

  1. Java中Iterator迭代器详解

    目录 一.Java中Iterator迭代器详解 1.为什么需要迭代器 2.迭代器长什么样子 3.如何使用迭代器 使用步骤: 代码演示: 迭代器可以简化为增强型for循环: 4.Iterator与Lis ...

  2. java拉姆达表达式事例,Java Lambda表达式详解和实例

    简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体( ...

  3. 代码检查规则:Java语言案例详解

    本节课程为<代码检查规则:Java语言案例详解>, 通常情况下Java的代码检查规则可以分为以下十类: 接下来,让我们具体来看看每个分类的内容. 一.源文件规范 该类规范主要从文件名.文件 ...

  4. Java 遍历HashMap详解

    Java 遍历HashMap详解 遍历KeySet() //遍历hashmap的keySetHashMap<String, Object> mapForKey = new HashMap& ...

  5. java常用集合详解

    文章目录 一.常用集合大纲 1.常用集合框架及介绍 2.集合和数组的区别 二.Collection 集合(接口) 三.List集合(接口) 1.存储遍历方式 2.ArrayList(实现类) 3.Li ...

  6. Java多线程进阶详解

    文章目录 1.卖票案例引入数据不安全问题 2.同步代码块 深入理解synchronized关键字 3.同步方法与静态同步方法 同步方法 静态同步方法 内置锁 静态同步方法与同步代码块共同使用 为什么要 ...

  7. Java 集合框架 详解

    一.Java 集合框架概述 集合框架是一个用来代表和操纵集合的统一架构(java集合框架位于java.util包中).所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.例如 Collec ...

  8. Java操作MongoDB详解

    Java操作MongoDB详解 1. MongoDB概述 1.1 MongoDB简介 1.2 MongoDB概念 2. MongoDB安装 2.1 MongoDB下载 2.2 MongoDB安装 2. ...

  9. Java内存溢出详解之Tomcat配置

    Java内存溢出详解 转自:http://elf8848.iteye.com/blog/378805 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError ...

  10. java基础(十三)-----详解内部类——Java高级开发必须懂的

    java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...

最新文章

  1. debstack 安装 openstack
  2. python学习笔记:(三)list(列表)常用的内置方法
  3. 2020\Simulation_1\7.音节判断
  4. 解决Coursera视频无法观看的问题
  5. 交叉表 列字段排序_Tableau学习系列(8):表计算
  6. 『设计模式』不看就亏了的设计模式总结
  7. 联合查询(查找所有分类及其父类)
  8. 【Java】关键词梳理
  9. 详解Python 3.6.x程序打包并发布至pypi的完整过程
  10. 计算机关机键消失了,如何解决Windows7电脑中的关机键不见了
  11. 死磕算法!精选35篇算法设计实例+6本必读书打包送你
  12. 【数据结构(C语言)】数据结构-内部排序
  13. Win7下如何破解Visual Studio2008 90天试用版
  14. 二级c语言 办公软件高级应用,高级应用题库_计算机国二office高级应用考试的题目是从题库20套里抽其中一套还是别的题目_淘题吧...
  15. [4K测试视频] 杜比4K UHD蓝光演示碟 Dolby.UHD.BluRay.Demo.Disc.March.2018.2160p.BluRay下载
  16. PHP发币,处理货币价值的PHP库
  17. 东芝移动硬盘无法弹出密保,无法执行该软件,因为未启动需要的服务程序
  18. Linux 创建oracle数据库
  19. element中el-select实现拼音搜索(el-autocomplete等下拉框搜索都可添加)
  20. 你参加了无数 “打卡” 群,为什么收获甚微。。。

热门文章

  1. MySQL innoDB数据插入性能优化
  2. Java经典设计模式 总览
  3. android SpannableString使用详解
  4. OAF_OAF Framework页面分析(概念)
  5. Use EventBus
  6. 极客唐小娟的故事-值得我们思考
  7. 利用数据绑定(DataBinding)简化多线程数据展示
  8. 【个人笔记】rabbitMQ下Fanout与Topic两种模式同时用注意事项
  9. Mac 使用Quik Time Player为iPhone录屏后, iPhone状态条时间变为9:41
  10. String hashCode为啥用31这个数字,很多人不知道!