Iterable是迭代器的意思,作用是为集合类提供for-each循环的支持。由于使用for循环需要通过位置获取元素,而这种获取方式仅有数组支持,其他许多数据结构,比如链表,只能通过查询获取数据,这会大大的降低效率。Iterable就可以让不同的集合类自己提供遍历的最佳方式。
Iterable的文档声明仅有一句:
Implementing this interface allows an object to be the target of the "for-each loop" statement.
其主要方法是返回一个Iterator
对象。
Iterator<T> iterator();
Iterator
对象我们有时也会用到,经常使用的while(it.hasNext())
中的hasNext
方法就是在这里定义的。Iterator
一共有四个方法:
// 判断一个对象集合是否还有下一个元素
boolean hasNext();
// 获取下一个元素
E next();
// 删除最后一个元素。默认是不支持的,因为在很多情况下其结果不可预测,比如数据集合在此时被修改
default void remove(){...}
// 主要将每个元素作为参数发给action来执行特定操作
default void forEachRemaining(Consumer<? super E> action){...}
Iterator
还有一个子接口,是为需要双向遍历数据时准备的,我们在ArrayList
和LinkedList
中都会看到它。其主要增加了以下几个方法:
// 是否有前一个元素
boolean hasPrevious();
// 获取前一个元素
E previous();
// 获取下一个元素的位置
int nextIndex();
// 获取前一个元素的位置
int previousIndex();
// 添加一个元素
void add(E e);
// 替换当前元素值
void set(E e);
Iterable的作用是很明显也很强大的,通过hasNext
方法,可以减少诸如链表等结构的查询复杂度,for和for-each循环的主要区别也在此。
网友评论
for与foreach有何区别,哪个更高效?
这个答案是不是
对于数组来说 for 和 foreach 效率差不多。
对于链表来说,foreach效率更高。
对foreach的内部实现还是有些模糊。