Java笔记---迭代器
2016-02-16 16:15
585 查看
一、介绍
迭代器是一个对象,通常被称为轻量级对象(因为创建它的代价小)其工作就是遍历并选择序列(容器)中的对象
迭代器也是一种设计模式,称为“迭代器模式”,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()); } }
[输出]
苹果 香蕉 西瓜 橘子 桃子 柚子 false 0
根据输出结果,我们也再次认识到,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> {...}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树