迭代器的引出

在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. JAVA_SE基础——69.Date类

    package cn.itcast.other; import java.text.ParseException; import java.text.SimpleDateFormat; import ...

  2. 关于网页设计的css+html相对定位和决定定位的理解

    css中有很多定位,其中最重要的是相对定位和绝对定位: 定位很重要,不搞好,网页就会很乱,显示的完全不是自己想要的效果,自己必须掌握: 首先说一个重要的结论:绝对定位,是不占位置的,总是相对离自己最近 ...

  3. ajax的原理解析

    一.关于同步与异步的分析: 异步传输是面向字符的传输,它的单位是字符:而同步传输是面向比特的传输,它的单位是桢,它传输的时候要求接受方和发送方的时钟是保持一致的.而ajax就是采用的异步请求方式的. ...

  4. 第一章 IDEA的使用

    第一章   IDEA的使用 1.为什么要使用idea 最智能的IDE IDEA相对于eclipse来说最大的优点就是它比eclipse聪明.聪明到什么程度呢?我们先来看几个简单的例子. A.智能提示重 ...

  5. 新概念英语(1-55)The Sawyer family

    新概念英语(1-55)The Sawyer family When do the children do their homework? The Sawyers live at 87 King Str ...

  6. 发布到NPMJS

    最近在做微服务的前后端设计,打算将客户端中的一个模块独立出来发布到npmjs上,因此,有机会了解了一下npm的发布过程. 参考了很多网上的文章,长篇累牍(但在这里还是真心感谢他们的分享),最终总结成一 ...

  7. python/Django(增、删、改、查)操作

    python/Django(增.删.改.查)操作 我们要通过pycharm中的Django模块连接MySQL数据库进行对数据的操作. 一.创建Django项目(每创建一个项目都要进行以下设置) 1.如 ...

  8. Oracle12c:创建主分区、子分区,实现自动分区插入效果

    单表自动单个分区字段使用方式,请参考:<Oracle12c:自动分区表> 两个分区字段时,必须一个主分区字段和一个子分区字段构成(以下代码测试是在oracle12.1版本): create ...

  9. 1.1 WEB API 在帮助文档页面进行测试

    这篇文章http://www.cnblogs.com/landeanfen/p/5210356.html写得比较详细, 我就挑简单的来说. 首先用这功能要在WEB API创建的帮助文档下面,如果你使用 ...

  10. requests-所有异常归类

    IOError RequestException HTTPError(RequestException) UnrewindableBodyError(RequestException) RetryEr ...