迭代器的引出

在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 里所有的方法最终目的是为了统一所有集合中的方法名称一样

java的迭代器详解的更多相关文章

  1. 黑马----JAVA迭代器详解

    JAVA迭代器详解 1.Interable.Iterator和ListIterator 1)迭代器生成接口Interable,用于生成一个具体迭代器 public interface Iterable ...

  2. 转:Java HashMap实现详解

    Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1.    HashMap概述:    HashMap是基于哈希表的M ...

  3. java集合框架详解

    java集合框架详解 一.Collection和Collections直接的区别 Collection是在java.util包下面的接口,是集合框架层次的父接口.常用的继承该接口的有list和set. ...

  4. Java集合类的详解与应用

    Java集合类的详解与应用 集合简介: 1.定义:可以同时存储不同类型的数据 他的存储空间会随着数据的增大而增大 2.缺点:只能存储引用数据类型 3.优点:更加合理的利用空间,封装了更多的方法,用起来 ...

  5. 最强Java并发编程详解:知识点梳理,BAT面试题等

    本文原创更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. 知识体系系统性梳理 Java 并发之基础 A. Java进阶 - Java 并发之基础:首先全局的了解并发的知识体系,同时了解 ...

  6. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  7. Java 序列化Serializable详解

    Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...

  8. Java String类详解

    Java String类详解 Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 类结构: public final ...

  9. 最新java数组的详解

    java中HashMap详解 http://alex09.iteye.com/blog/539545 总结: 1.就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java ...

随机推荐

  1. python time、datetime、random、os、sys模块

    一.模块1.定义模块:用来从逻辑上组织Python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件(文件名:test.py,对应的模块名:test)包:用来从逻辑上组织 ...

  2. python的模块和包

    ==模块== python语言的组织结构层次: 包->模块->代码文件->类->函数->代码块 什么是模块呢 可以把模块理解为一个代码文件的封装,这是比类更高一级的封装层 ...

  3. angular2 学习笔记 ( angular cli & npm version manage npm 版本管理 )

    更新 : 2017-05-05 现在流行 Yarn ! 它是 facebook google 推出的东西. 算是补助 npm 做的不够好的地方. 源码依然是发布去 npm,只是下载接口换掉罢了哦. n ...

  4. maven入门(1-3)maven的生命周期

      maven的生命周期 maven的生命周期是抽象的,其实际行为都由插件来完成,引入maven 的 生命周期就是为了对所有的构建过程进行抽象和统一. 这种方式类似于模板方法,模板方法模式在父类中定义 ...

  5. 相同域名不同端口的两个应用,cookie名字、路径都相同的情况下,会覆盖吗

    首先答案是: 会的. 本地测试流程: 两个相同的应用,代码完全相同:只是部署在两个不同的tomcat:域名都是localhost 应用A:部署在http://localhost:8087/ 应用B:部 ...

  6. WPF项目学习.四

    信息收录项目 版权声明:本文为博主初学经验,未经博主允许不得转载. 一.前言 记录在学习与制作WPF过程中遇到的解决方案.  需求文案.设计思路.简要数据库结构.简要流程图和明细代码,动图细化每步操作 ...

  7. python如何转换word格式、读取word内容、转成html

    # python如何转换word格式.读取word内容.转成html? import docx from win32com import client as wc # 首先将doc转换成docx wo ...

  8. 关于MySQL Online DDL

    1. Online DDL 在 MySQL 5.1 (带InnoDB Plugin)和5.5中,有个新特性叫 Fast Index Creation(下称 FIC),就是在添加或者删除二级索引的时候, ...

  9. 全球性WannaCry蠕虫勒索病毒感染前后应对措施

    前言:针对WannaCrypt勒索病毒的讨论和技术文章是铺天盖地,大量的技术流派,安全厂家等纷纷献计献策,有安全厂家开发各种安全工具,对安全生态来说是一个好事,但对个人未必就是好事,我们国家很多用户是 ...

  10. [MongoDB教程] 1.简介

    MongoDB (名称来自「humongous (巨大无比的)」), 是一个可扩展的高性能,开源,模式自由,面向文档的NoSQL,基于 分布式 文件存储,由 C++ 语言编写,设计之初旨在为 WEB ...