Java笔记---迭代器
来源:互联网 发布:淘宝新店铺怎么上货 编辑:程序博客网 时间:2024/06/08 10:31
一、介绍
- 迭代器是一个对象,通常被称为轻量级对象(因为创建它的代价小)
- 其工作就是遍历并选择序列(容器)中的对象
- 迭代器也是一种设计模式,称为“迭代器模式”,Java中已经内置实现好了
- 在Java中,我们可以使用其内置的 Iterator,也可实现属于自己的 Iterator
二、Java 中的 Iterator
2.1 介绍
- Java采用了迭代器为各种容器提供公共的操作接口(java.util.Iterator)。
- 使用Java的迭代器iterator可以使得对容器的遍历操作完全与其底层相隔离,可以到达很好的解耦效果。
2.2 Iterator 接口
该接口源码如下,只包含了 3 个方法
public interface Iterator<E> { boolean hasNext(); // 检查序列中是否还有元素 E next(); // 获取序列中的下一个元素 void remove(); // 将迭代器新近返回的元素删除}
由源码就可以看出,Java 的 Iterator 接口只能单向移动。
2.3 示例代码
/** - Java 迭代器的使用 - @author johnnie * */public class SimpleIterator { private static List<String> fruits; static { fruits = new ArrayList<String>(); fruits.add("苹果"); fruits.add("香蕉"); fruits.add("西瓜"); fruits.add("橘子"); fruits.add("桃子"); fruits.add("柚子"); } public static void main(String[] args) { // 获取 Iterator Iterator<String> iterator = fruits.iterator(); // 遍历元素 while (iterator.hasNext()) { String fruit = iterator.next(); // 获得容器中的下一个元素 System.out.println(fruit); } System.out.println(iterator.hasNext()); // 已到末尾,输出为 false iterator = fruits.iterator(); for (int i = 0; i < 6; i ++) { iterator.next(); iterator.remove(); // 移除元素 } System.out.println(fruits.size()); }}
[输出]
苹果香蕉西瓜橘子桃子柚子false0
根据输出结果,我们也再次认识到,Java 基础的 Iterator 是单向移动的,不能返回。要再次返回容器中的第一个元素位置,只能重新获取该容器的 Iterator。
[注]
1. 对于 List 容器来说,还有一个更为强大的 Iterator 的子类型:ListIterator
2. ListIterator 只能用于各种 List 的访问
3. 与其他 Iterator 不同的是,ListIterator 可以双向移动
4. 获取方法:ListIterator listIterator = fruits.listIterator();
三、 Iterable 接口
3.1 介绍
- 该接口包含一个能产生 Iterator 的 Iterator() 方法
- 其实现类可以用于 foreach 语句中
3.2 实例代码
本实例代码用于演示 Iterable 接口的基本使用
public class SimpleIterable implements Iterable<String> { private static List<String> fruits; static { fruits = new ArrayList<String>(); fruits.add("苹果"); fruits.add("香蕉"); fruits.add("西瓜"); fruits.add("橘子"); fruits.add("桃子"); fruits.add("柚子"); } public void add(String fruit){ fruits.add(fruit); } @Override public Iterator<String> iterator() { // 使用匿名内部类来实现遍历容器中的所有元素 return new Iterator<String>() { private int index = 0; @Override public boolean hasNext() { return (index < fruits.size()); } @Override public String next() { return fruits.get(index ++); } @Override public void remove() { // 抛出一个不支持的操作异常 throw new UnsupportedOperationException(); } }; } public static void main(String[] args) { SimpleIterable si = new SimpleIterable(); si.add("哈密瓜"); si.add("火龙果"); // Iterable 接口的实现类可以像数组、Collection 对象一样应用于 Foreach 语句 for(String s : si){ System.out.print(s + " "); } }}
[输出]
苹果 香蕉 西瓜 橘子 桃子 柚子 哈密瓜 火龙果
- 按上述的代码,通过实现 Iterable 接口,我们就可以实现属于自己的容器。
- 现在我们就知道为什么所有 Collection 类对象都可以应用于 Foreach 语句中了,因为 Collection 也实现了 Iterable 接口。因此我们可以知道,只要是实现了 Iterable 接口的类,都能应用于 Foreach 语句中
[注] Collection 源码中实现了 Iterable,如下
public interface Collection<E> extends Iterable<E> {...}
1 0
- java学习笔记---迭代器
- Java笔记---迭代器
- Java笔记——迭代器
- Java笔记20:迭代器模式
- java笔记
- JAVA笔记
- java笔记
- java笔记
- JAVA笔记
- java笔记
- Java 笔记
- java笔记
- java 笔记
- java笔记
- java笔记
- java笔记
- Java笔记
- java笔记
- Oracle数据库索引
- C语言 switch语句的的用法
- usaco sprime
- hrbust 哈理工OJ 1498Elevator Trouble【BFS过】
- ContentValues的用法
- Java笔记---迭代器
- Java-day05集合
- Spring学习
- usaco subset
- git命令之git tag 给当前分支打标签
- usaco transform
- 关于利用trml2pdf生成PDF出现【flowable not yet implemented】错误的原因
- webstorm:修改为黑色背景 好看的webstorm主题
- Tomcat7中开启gzip压缩功能的配置方法