迭代器的引出

在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. Django-rest-framework源码分析----认证

    一.前言 1.1.安装 两种方式: github pip直接安装 pip install django-rest-framework 1.2.需要先了解的一些知识 理解下面两个知识点非常重要,djan ...

  2. 【转】Python处理wave文件

    #本文PDF版下载 Python解析Wav文件并绘制波形的方法 #本文代码下载 Wav波形绘图代码 #本文实例音频文件night.wav下载 音频文件下载 (石进-夜的钢琴曲) 前言 在现在繁忙的生活 ...

  3. windows安装虚拟主机virtualbox遇到的困难

    本来想到可以在windows安装虚拟主机virtualbox,但是怎么自己的windows是盗版的,由于主题已经被破解了,所以不能安装结果强制性的进入pe然后从网上下载的dll文件复制到 c/wind ...

  4. 一张图说明 Web Api 参数绑定默认规则

    请求如下: 控制器如下: 慎重说明:不管请求方式是 get 还是 post , 简单类型的参数,如 name 和 id ,其值都是从 url 里面去取. Web API 从 url 还是 body 获 ...

  5. 第5章 子网划分和CIDR

    第5章 子网划分和CIDR 划分网络 根据A类.B类或C类网络ID来识别网段具有一些局限性,主要是在网络级别之下不能对地址空间进行任何逻辑细分 如果一个IP是一个A类网络.数据报到达网关,然后传输到9 ...

  6. 新概念英语(1-119)who call out to the thieves in the dark?

    who call out to the thieves in the dark? A true story Do you like stories? I want to tell you a true ...

  7. notepad++运行Python

    1.打开notepad++的菜单栏,点击run 2.输入cmd /k python "$(FULL_CURRENT_PATH)" & PAUSE & EXIT 3. ...

  8. scrapy的命令行

    scrapy --help 列出帮助信息以及常用命令scrapy version 列出scrapy版本scrapy version -v 列出详细的scrapy版本以及各组件信息 scrapy sta ...

  9. append()/extend()/insert()/remove()/del/pop()/slice列表分片

    member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88] member.append('字符串')#在列表结尾处增加字符串 memb ...

  10. 对return函数的认识

    例1: def funOut(): def funIn(): print('宾果!你成功访问到我啦!') return funIn() #注意这里return的是funIn()即是一个函数 funOu ...