本文基于jdk11,IDE为IDEA
对比| Iterable | Iterator | |
|---|---|---|
| 描述 | 实现该接口的对象具有“增强for循环”的能力 | 取代java集合中的 Enumeration 接口,允许迭代中删除 |
| 包层级不同 | java.lang | java.util |
| 方法 | Iterator iterator(); default void forEach(Consumer super T> action) default Spliterator spliterator() | boolean hasNext(); E next(); default void remove() default void forEachRemaining(Consumer super E> action) |
| jdk | since 1.5 | since 1.2 |
总结:
- 两者包的层级不同,Iterable位于 java.lang,Iterator位于 java.util
- 通过实现Iterable接口,可通过方法iterator()获取迭代器Iterator
- 都有遍历能力
Iterable依赖增强For循环
Iterable可使用方法 next()& hasNext()结合实现迭代 或者 使用 forEachRemaining(内部使用next()& hasNext()) - Iterator 可在遍历中删除
//返回一个类型为Iterator的迭代器类型 Iterator iterator(); default void forEach(Consumer super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } // TODO default Spliterator spliterator()
//当前迭代器是否还有元素
boolean hasNext();
//返回下一个元素
E next();
//删除元素
default void remove() {
throw new UnsupportedOperationException("remove");
}
//直接传入concumer即可消费元素
default void forEachRemaining(Consumer super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
代码实践
Iterable
public class LearnIterable {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
//返回迭代器
Iterator iterator = list.iterator();
//forEach方法,底层用的是增强for循环
list.forEach(System.out::println);
//spliterator()方法,返回一个分路器,此处需参见另一篇文章《》 //TODO
Spliterator spliterator = list.spliterator();
}
}
Iterator
package com.yiklam.java.util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class LearnIterator {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
//获取迭代器(该类实现了Iterable接口)
Iterator iterator = list.iterator();
//判断是否还有下一个元素
System.out.println("----------------------------------------------------------------------");
System.out.println("iterator.hasNext() = " + iterator.hasNext());
//获取下一个元素
System.out.println("----------------------------------------------------------------------");
System.out.println("iterator.next() = " + iterator.next());
//移除指向的元素
System.out.println("----------------------------------------------------------------------");
System.out.println("调用 iterator.remove();");
iterator.remove();
//重新获取迭代器
iterator = list.iterator();
//使用api手动编码遍历
System.out.println("----------------------------------------------------------------------");
System.out.println("使用 hasNext & next 遍历");
while (iterator.hasNext()){
System.out.printf("" + iterator.next());
}
System.out.println("n");
//使用迭代器的 forEachRemaining(Consumer super E> action) 方法,传入Comsumer来进行遍历消费
System.out.println("----------------------------------------------------------------------");
System.out.println("使用 forEachRemaining 遍历");
list.iterator().forEachRemaining(System.out::println);
}
}
源码
Iterable
package java.lang; import java.util.Iterator; import java.util.Objects; import java.util.Spliterator; import java.util.Spliterators; import java.util.function.Consumer; public interface IterableIterator{ Iterator iterator(); default void forEach(Consumer super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } default Spliterator spliterator() { return Spliterators.spliteratorUnknownSize(iterator(), 0); } }
package java.util; import java.util.function.Consumer; public interface Iterator参考{ boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer super E> action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); } }
java 8 stream中的Spliterator简介:https://www.cnblogs.com/flydean/p/java-8-stream-spliterator.html
java 8 stream 中 Spliterator 使用,开发利器! https://zhuanlan.zhihu.com/p/136413544



