迭代器

为了方便的处理集合中的元素,Java中出现了一个对象,该对象提供了一些方法专门处理集合中的元素.例如删除和获取集合中的元素.该对象就叫做迭代器(Iterator).

对 Collection 进行迭代的类,称其为迭代器。还是面向对象的思想,专业对象做专业的事情,迭代器就是专门取出集合元素的对象。但是该对象比较特殊,不能直接创建对象(通过new),该对象是以内部类的形式存在于每个集合类的内部。

如何获取迭代器?Collection接口中定义了获取集合类迭代器的方法(iterator()),所以所有的Collection体系集合都可以获取自身的迭代器。

正是由于每一个容器都有取出元素的功能。这些功能定义都一样,只不过实现的具体方式不同(因为每一个容器的数据结构不一样)所以对共性的取出功能进行了抽取,从而出现了Iterator接口。而每一个容器都在其内部对该接口进行了内部类的实现。也就是将取出方式的细节进行封装。

1.   Iterable

Jdk1.5之后添加的新接口, Collection的父接口. 实现了Iterable的类就是可迭代的.并且支持增强for循环。该接口只有一个方法即获取迭代器的方法iterator()可以获取每个容器自身的迭代器Iterator。(Collection)集合容器都需要获取迭代器(Iterator)于是在5.0后又进行了抽取将获取容器迭代器的iterator()方法放入到了Iterable接口中。Collection接口进程了Iterable,所以Collection体系都具备获取自身迭代器的方法,只不过每个子类集合都进行了重写(因为数据结构不同)

2.  Iterator

Iterator iterator() 返回该集合的迭代器对象

该类主要用于遍历集合对象,该类描述了遍历集合的常见方法1:java.lang. Itreable---|Itreable 接口 实现该接口可以使用增强for循环---|Collection 描述所有集合共性的接口---|List接口 可以有重复元素的集合---| Set接口 不可以有重复元素的集合

public interface Iterable

Itreable   该接口仅有一个方法,用于返回集合迭代器对象。

1: Iterator iterator() 返回集合的迭代器对象

Iterator接口定义的方法

Itreator 该接口是集合的迭代器接口类,定义了常见的迭代方法1:booleanhasNext()

判断集合中是否有元素,如果有元素可以迭代,就返回true。2: E next()

返回迭代的下一个元素,注意: 如果没有下一个元素时,调用next元素会抛出NoSuchElementException3: voidremove()

从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。

思考:为什么next方法的返回类型是Object的呢? 为了可以接收任意类型的对象,那么返回的时候,不知道是什么类型的就定义为object

3.   迭代器遍历

1:while循环

public static voidmain(String[] args) {

ArrayList list= newArrayList();//增加:add() 将指定对象存储到容器中

list.add("计算机网络");

list.add("现代操作系统");

list.add("java编程思想");

list.add("java核心技术");

list.add("java语言程序设计");

System.out.println(list);

Iterator it=list.iterator();while(it.hasNext()) {

String next=(String) it.next();

System.out.println(next);

}

}

2:for循环

importjava.util.ArrayList;importjava.util.Iterator;public classDemo2 {public static voidmain(String[] args) {

ArrayList list= newArrayList();//增加:add() 将指定对象存储到容器中

list.add("计算机网络");

list.add("现代操作系统");

list.add("java编程思想");

list.add("java核心技术");

list.add("java语言程序设计");

System.out.println(list);for (Iterator it =list.iterator(); it.hasNext();) {//迭代器的next方法返回值类型是Object,所以要记得类型转换。

String next =(String) it.next();

System.out.println(next);

}

}

}

需要取出所有元素时,可以通过循环,java 建议使用for 循环。因为可以对内存进行一下优化。

3:使用迭代器清空集合

public classDemo1 {public static voidmain(String[] args) {

Collection coll= newArrayList();

coll.add("aaa");

coll.add("bbb");

coll.add("ccc");

coll.add("ddd");

System.out.println(coll);

Iterator it=coll.iterator();while(it.hasNext()) {

it.next();

it.remove();

}

System.out.println(coll);

}

}

细节一:

如果迭代器的指针已经指向了集合的末尾,那么如果再调用next()会返回NoSuchElementException异常

importjava.util.ArrayList;importjava.util.Iterator;public classDemo2 {public static voidmain(String[] args) {

ArrayList list= newArrayList();//增加:add() 将指定对象存储到容器中

list.add("计算机网络");

list.add("现代操作系统");

list.add("java编程思想");

list.add("java核心技术");

list.add("java语言程序设计");

System.out.println(list);

Iterator it=list.iterator();while(it.hasNext()) {

String next=(String) it.next();

System.out.println(next);

}//迭代器的指针已经指向了集合的末尾//String next = (String) it.next();//java.util.NoSuchElementException

}

}

细节二:

如果调用remove之前没有调用next是不合法的,会抛出IllegalStateException

importjava.util.ArrayList;importjava.util.Iterator;public classDemo2 {public static voidmain(String[] args) {

ArrayList list= newArrayList();//增加:add() 将指定对象存储到容器中

list.add("计算机网络");

list.add("现代操作系统");

list.add("java编程思想");

list.add("java核心技术");

list.add("java语言程序设计");

System.out.println(list);

Iterator it=list.iterator();while(it.hasNext()) {//调用remove之前没有调用next是不合法的//it.remove();//java.lang.IllegalStateException

String next =(String) it.next();

System.out.println(next);

}

}

}

4:迭代器原理

查看ArrayList源码

private class Itr implements Iterator{int cursor = 0;int lastRet = -1;int expectedModCount =modCount;public booleanhasNext() {return cursor !=size();

}publicE next() {

checkForComodification();try{

E next=get(cursor);

lastRet= cursor++;returnnext;

}catch(IndexOutOfBoundsException e) {

checkForComodification();throw newNoSuchElementException();

}

}public voidremove() {if (lastRet == -1)throw newIllegalStateException();

checkForComodification();try{

AbstractList.this.remove(lastRet);if (lastRet

cursor--;

lastRet= -1;

expectedModCount=modCount;

}catch(IndexOutOfBoundsException e) {throw newConcurrentModificationException();

}

}

}

5:注意在对集合进行迭代过程中,不允许出现迭代器以外的对元素的操作,因为这样会产生安全隐患,java会抛出异常并发修改异常(ConcurrentModificationException),普通迭代器只支持在迭代过程中的删除动作。

注意:      ConcurrentModificationException: 当一个集合在循环中即使用引用变量操作集合又使用迭代器操作集合对象, 会抛出该异常。

importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;public classDemo1 {public static voidmain(String[] args) {

Collection coll= newArrayList();

coll.add("aaa");

coll.add("bbb");

coll.add("ccc");

coll.add("ddd");

System.out.println(coll);

Iterator it=coll.iterator();while(it.hasNext()) {

it.next();

it.remove();

coll.add("abc"); //出现了迭代器以外的对元素的操作

}

System.out.println(coll);

}

}

如果是List集合,想要在迭代中操作元素可以使用List集合的特有迭代器ListIterator,该迭代器支持在迭代过程中,添加元素和修改元素。

4.     List特有的迭代器ListIterator

public interface ListIterator extends Iterator

ListIterator listIterator()

---|Iterator

hasNext()

next()

remove()------|ListIterator Iterator子接口 List专属的迭代器

add(E e) 将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有)voidset(E o) 用指定元素替换 next 或 previous 返回的最后一个元素

hasPrevious() 逆向遍历列表,列表迭代器有多个元素,则返回true。

previous() 返回列表中的前一个元素。

Iterator在迭代时,只能对元素进行获取(next())和删除(remove())的操作。

对于 Iterator 的子接口ListIterator 在迭代list 集合时,还可以对元素进行添加

(add(obj)),修改set(obj)的操作。

importjava.util.ArrayList;importjava.util.ListIterator;public classDemo2 {public static voidmain(String[] args) {

ArrayList list= newArrayList();//增加:add() 将指定对象存储到容器中

list.add("计算机网络");

list.add("现代操作系统");

list.add("java编程思想");

list.add("java核心技术");

list.add("java语言程序设计");

System.out.println(list);//获取List专属的迭代器

ListIterator lit =list.listIterator();while(lit.hasNext()) {

String next=(String) lit.next();

System.out.println(next);

}

}

}

倒序遍历

importjava.util.ArrayList;importjava.util.ListIterator;public classDemo2 {public static voidmain(String[] args) {

ArrayList list= newArrayList();//增加:add() 将指定对象存储到容器中

list.add("计算机网络");

list.add("现代操作系统");

list.add("java编程思想");

list.add("java核心技术");

list.add("java语言程序设计");

System.out.println(list);//获取List专属的迭代器

ListIterator lit =list.listIterator();while(lit.hasNext()) {

String next=(String) lit.next();

System.out.println(next);

}

System.out.println("***************");while(lit.hasPrevious()) {

String next=(String) lit.previous();

System.out.println(next);

}

}

}

Set方法:用指定元素替换 next 或 previous 返回的最后一个元素

importjava.util.ArrayList;importjava.util.ListIterator;public classDemo2 {public static voidmain(String[] args) {

ArrayList list= newArrayList();//增加:add() 将指定对象存储到容器中

list.add("计算机网络");

list.add("现代操作系统");

list.add("java编程思想");

list.add("java核心技术");

list.add("java语言程序设计");

System.out.println(list);

ListIterator lit=list.listIterator();

lit.next();//计算机网络

lit.next(); //现代操作系统

System.out.println(lit.next()); //java编程思想//用指定元素替换 next 或 previous 返回的最后一个元素

lit.set("平凡的世界");//将java编程思想替换为平凡的世界

System.out.println(list);

}

}

add方法将指定的元素插入列表,该元素直接插入到 next 返回的元素的后

public classDemo2 {public static voidmain(String[] args) {

ArrayList list= newArrayList();//增加:add() 将指定对象存储到容器中

list.add("计算机网络");

list.add("现代操作系统");

list.add("java编程思想");

list.add("java核心技术");

list.add("java语言程序设计");

System.out.println(list);

ListIterator lit=list.listIterator();

lit.next();//计算机网络

lit.next(); //现代操作系统

System.out.println(lit.next()); //java编程思想//将指定的元素插入列表,该元素直接插入到 next 返回的元素的后

lit.add("平凡的世界");//在java编程思想后添加平凡的世界

System.out.println(list);

}

}

java迭代器_74.Java迭代器相关推荐

  1. java for 迭代器_Java基础-迭代器Iterator与语法糖for-each

    迭代器Iterator与语法糖for-each 一.为什么需要迭代器 设计模式迭代器 迭代器作用于集合,是用来遍历集合元素的对象.迭代器不是Java独有的,大部分高级语言都提供了迭代器来遍历集合.实际 ...

  2. java设计模式迭代器模式_迭代器设计模式示例

    java设计模式迭代器模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式 ...

  3. java设计模式迭代器模式_迭代器模式和Java

    java设计模式迭代器模式 大家好,在本文中,我们将检查Iterator Pattern . 我知道你们中许多人已经使用过一种设计模式,但是也许您没有意识到它是模式,或者不知道它的巨大价值. 根据&l ...

  4. java it_关于 Java Iterator(迭代器)学习笔记

    相信 "迭代" 对于Java程序员来说并不陌生(当然,其他语言的程序员也是如此),在处理数据时,不可避免地会存在对数据的大量遍历操作.对于我自己而言,学习使用Java语言两年时间, ...

  5. java集合迭代器_java集合迭代器

    一.Java中有一个设计模式是迭代器模式 1.迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 2.迭代器模式概述 Java集 ...

  6. java迭代例子_Java 迭代器的代码实例详解

    一.摘要 迭代器模式是与集合共生共死的.一般来说,我们只要实现一个容器,就需要同时提供这个容器的迭代器.使用迭代器的好处是:封装容器的内部实现细节,对于不同的集合,可以提供统一的遍历方式,简化客户端的 ...

  7. C++、Java、JavaScript中迭代器的用法

    编程思想之迭代器 什么是迭代器? 迭代器(Iterator)是按照一定的顺序对一个或多个容器中的元素从前往遍历的一种机制,比如for循环就是一种最简单的迭代器,对一个数组的遍历也是一种的迭代遍历的过程 ...

  8. Java设计模式系列之——迭代器模式

    本篇我们采取倒叙的手法来讲解迭代器模式,先看下面一段我们在平时工作中常见的代码: package com.mazhichu.designpatterns.iterator;import java.ut ...

  9. Java 设计模式之【迭代器】学习与掌握

    文章目录 定义 优点 缺点 模式的结构与实现 模式的结构 模式的实现 应用场景 定义 提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示. 迭代器模式是一种对象行为型模式 优点 ...

最新文章

  1. 3分钟读懂!微服务分布式日志体系架构!
  2. 兑吧:游戏化玩转用户运营的三驾马车
  3. 阿里云服务器学习笔记【远程连接、Xshell使用】
  4. react复制内容到剪贴板
  5. php 修改html文件内容吗,请问你们怎么将html的文件的内容改变为php
  6. 浅谈Vue内置component组件的应用场景
  7. Elasticsearch就这么简单
  8. 干得最多最累,工资还不如新人
  9. App工程从Eclipse迁移到Android Studio的问题总结
  10. windows 的一些快捷键
  11. [偏相关分析]偏相关系数计算及假设检验
  12. qq轻聊版打开后显示服务器返回数据错误,电脑qq登录报错误报告如何处理_qq打开显示错误报告的解决方法...
  13. Delta3D(6)教程:创建游戏角色-2
  14. HMS Core Insights第三期直播预告—— 当我们在谈论App的时候,我们还可以谈论什么?
  15. QtCreator总是崩溃卡死的问题
  16. 前端面试题——计算机网络 高频
  17. 大数据早报:Firebase推出机器学习功能 英伟达大幅扩大深度学习学院规模(11.2)
  18. 神经网络正向与反向传播
  19. java 日期calendar_java成神之——date和calendar日期的用法
  20. 微信隐藏功能:微信提现怎么免手续费?勤俭持家的福音,2步做到

热门文章

  1. 解决oracle客户端乱码问题,如何解决oracle客户端中文乱码问题?-Oracle
  2. linux yum安装redis5.0,CentOS 7安装Redis 5.0.5并加入Systemd服务
  3. java camel swagger,Swagger将下划线转换为camelcase
  4. 在华为推送平台给手机推送步骤
  5. android快速点击分析
  6. findViewById报空指针异常
  7. 基于JAVA+Servlet+JSP+MYSQL的教师教学评价系统
  8. 08-可滚动Widget
  9. 冲刺阶段(二) 第六天
  10. WEB-INF/views/menu/list.jsp (line: 26, column: 58) equal symbol expected