java的迭代器详解
迭代器的引出
在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的迭代器详解的更多相关文章
- 黑马----JAVA迭代器详解
JAVA迭代器详解 1.Interable.Iterator和ListIterator 1)迭代器生成接口Interable,用于生成一个具体迭代器 public interface Iterable ...
- 转:Java HashMap实现详解
Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1. HashMap概述: HashMap是基于哈希表的M ...
- java集合框架详解
java集合框架详解 一.Collection和Collections直接的区别 Collection是在java.util包下面的接口,是集合框架层次的父接口.常用的继承该接口的有list和set. ...
- Java集合类的详解与应用
Java集合类的详解与应用 集合简介: 1.定义:可以同时存储不同类型的数据 他的存储空间会随着数据的增大而增大 2.缺点:只能存储引用数据类型 3.优点:更加合理的利用空间,封装了更多的方法,用起来 ...
- 最强Java并发编程详解:知识点梳理,BAT面试题等
本文原创更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. 知识体系系统性梳理 Java 并发之基础 A. Java进阶 - Java 并发之基础:首先全局的了解并发的知识体系,同时了解 ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Java 序列化Serializable详解
Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...
- Java String类详解
Java String类详解 Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 类结构: public final ...
- 最新java数组的详解
java中HashMap详解 http://alex09.iteye.com/blog/539545 总结: 1.就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java ...
随机推荐
- WPS怎么让前几页的页眉或者页脚与后面的不同
其实不管利用WPS还是office对文档还是PPT进行操作,其实核心思想还是一种编程,主要是前端的编程,就是通过改变一些这些软件设置的样式,然后通过改变这些样式,使这些文字以老师要求的格式显示出来的, ...
- VS 2008 开发WinCE程序 编译部署速度慢的解决办法
1.找到以下文件 C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.CompactFramework.Common.targets 2.用记事本打开该 ...
- Netty事件监听和处理(下)
上一篇 介绍了事件监听.责任链模型.socket接口和IO模型.线程模型等基本概念,以及Netty的整体结构,这篇就来说下Netty三大核心模块之一:事件监听和处理. 前面提到,Netty是一个NIO ...
- gradle入门(1-1)gradle的概念和使用
一.Gradle是什么 Gradle是一种Java应用构建工具,它采用领域特定语言 Groovy 语法实现配置. 1.Gradle的基本概念 项目:项目的配置 即 build.gradle. 任务:任 ...
- python网络爬虫与信息提取 学习笔记day2
Day2: 查看robots协议: 查看京东的robots协议 查看百度的robots协议,可以看到百度拒绝了搜狗的爬虫233 爬取京东商品页面相关信息: import requests url = ...
- HTML初识
HTML初识 web服务本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) so ...
- hdu-2141 Can you find it?---暴力+二分
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2141 题目大意: 给ABC三个数组,给一个X,求是否存在Ai+Bj+Ck = X 思路: 等式转化成 ...
- scrapy 选择器官方文档
当抓取网页时,常见的任务是从HTML源码中提取数据.现有的一些库可以达到这个目的: BeautifulSoup lxml Scrapy 提取数据有自己的一套机制.它们被称作选择器(seletors), ...
- 小工具:批量导入导出主机上的docker镜像
工作需要,将主机上的部分镜像导出为tar文件,放便在其他主机上使用 用python实现了一个批量打包脚本: import re import os import subprocess if __nam ...
- Tab标签js切换高效率写法
原来的传统写法: function tabit(id,cid) { for(var i=0; i<10; i++){ gi(["tab"+i]).className = &q ...