网站首页 > java教程 正文
Iterator和Iterable是Java集合框架中的两个核心接口,主要的作用就是集合元素的遍历操作,但是在Java中,Iterable接口和Iterator接口的用途有所不同,这也是为什么通常会实现Iterable接口而不是直接实现Iterator接口的原因,下面我们就来通过详细的分析来介绍一下二者的区别与联系。
概念介绍
Iterator接口
Iterator接口定义了遍历集合的标准方法,并且提供了一种逐个访问集合中元素的方式,这种方式不需要暴露集合的底层表示就可以实现集合的遍历。Iterator接口包含以下三个方法,源码如下所示。
public interface Iterator<E> {
boolean hasNext(); // 返回true,如果仍有元素可以迭代
E next(); // 返回下一个元素
void remove(); // 移除上一个返回的元素(可选操作)
}
Iterator接口用于实际的元素遍历。通过调用iterator()方法,一个Iterator对象会被返回,然后可以使用hasNext()和next()方法来迭代元素。
Iterable接口
Iterable接口定义表示了一个可以返回Iterator的集合操作。它是集合类的一个基本接口操作,使得集合可以在内部增强的for-each循环。在Iterable接口中包含一个方法,如下所示。
public interface Iterable<T> {
Iterator<T> iterator(); // 返回一个迭代器
}
增强的for-each循环,如下所示
for (Element e : iterableCollection) {
// 使用元素e
}
实现了Iterable接口的类可以返回一个Iterator的迭代器对象对象,通过这个迭代器对象可以来遍历其内部的元素。
为什么实现Iterable接口?
增强的for-each循环
实现Iterable接口,一个重要的目的就是为了利用该类来增强的for-each循环操作,通过这种增强操作可以快速高效的实现集合对象的遍历。
职责分离
Iterable接口和Iterator接口的职责是不同的,其中Iterable接口表示一个集合,其可以产生一个Iterator对象;而Iterator接口表示遍历集合的一个具体实现。
而实现Iterable接口意味着类表示一个可以被遍历的集合,而实现Iterator接口则表示类自身是遍历行为的实现,这在程序设计上是不合适的。
多次遍历
通过实现Iterable接口,使得每次调用iterator()方法都可以返回一个新的Iterator对象,这样就可以多次遍历集合对象。
而如果一个类类本身实现了Iterator接口,那么它可能无法支持多次遍历,因为Iterator通常是一次性使用的,遍历一次之后就结束了。
实现示例
实现Iterable接口
import java.util.Iterator;
public class MyCollection<T> implements Iterable<T> {
private T[] items;
private int size;
public MyCollection(T[] items) {
this.items = items;
this.size = items.length;
}
@Override
public Iterator<T> iterator() {
return new MyIterator();
}
private class MyIterator implements Iterator<T> {
private int index = 0;
@Override
public boolean hasNext() {
return index < size;
}
@Override
public T next() {
if (!hasNext()) {
throw new IllegalStateException();
}
return items[index++];
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
}
接下来就是看如何使用这个类了,如下所示。
public class Main {
public static void main(String[] args) {
MyCollection<String> collection = new MyCollection<>(new String[] {"A", "B", "C"});
for (String item : collection) {
System.out.println(item);
}
}
}
通过这种方式,MyCollection类实现了Iterable接口,可以生成一个Iterator对象,从而支持增强的for-each循环和多次遍历。
总结
通过上面的介绍,我们也了解了,通过实现Iterable接口,类可以在增强的for-each循环中使用,而Iterator接口用于实际的元素遍历,所以这也就是Java为什么不直接实现Iterator接口,而是实现Iterable接口的原因。
- 上一篇: 设计模式之迭代器模式(Java实现)
- 下一篇: Python迭代器对象使用
猜你喜欢
- 2025-01-10 Java 中经常被提到的 SPI 到底是什么?
- 2025-01-10 23种设计模式总结详解(全23种)
- 2025-01-10 Java 中的反应式编程 (RxJava)
- 2025-01-10 Java Stream
- 2025-01-10 推荐给 Java 初学者硬核书籍,亲身经历让你少走弯路
- 2025-01-10 Spring Boot集成AJ-Captcha实现滑动验证码功能
- 2025-01-10 java.util.ArrayList 原理详细介绍
- 2025-01-10 Java ArrayList用法详解附代码示例
- 2025-01-10 Java SPI详解
- 2025-01-10 Qt——容器类
你 发表评论:
欢迎- 04-24Java Collections 工具类集合框架中常用算法解析
- 04-24桶排序的简单理解
- 04-24Java集合框架底层实现原理大揭秘
- 04-24Java 集合框架全面解析:选对数据结构,提升开发效率
- 04-24c#集合排序
- 04-24Java面试中常被问到的集合类深度解读
- 04-24VBA技术资料MF278:对集合进行排序
- 04-24Spring 最常用的 7 大类注解,史上最强整理
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)