Iterable与Iterator的区别
1.从表面的意思去理解
Iterable:顾名思义,实现了这个接口的集合对象就支持迭代操作,是可迭代的。able结尾表示 能…样,可以做…
Iterator:在英语中or结尾都是表示 …样的人或者 …者。如creator就是创作者的意思。这里也是一样:Iterator就是迭代者,我们一般叫迭代器,它就是提供迭代机制的对象,具体如何迭代,都是Iterator接口规范的。
2.Iterable
一个集合对象要表明自己支持迭代,能有使用foreach语句的特权,就必须实现Iterable接口,表明我是可迭代的!然而实现Iterable接口,就必须为foreach语句提供一个迭代器。
这个接口里面只有一个用Iterator接口定义的iterator方法,也就是iterator方法需要返回一个Iterator对象。
// Iterable JDK源码
// 可以通过成员内部类,方法内部类,甚至匿名内部类去实现Iterator
public interface Iterable<T> {
Iterator<T> iterator();
}
3.Iterator
包含3个方法: hasNext , next , remove。remove按需求实现,一般它很少用到,以至于Eclipse接口方法自动补全时,都忽略了remove放方法。
1、每次在迭代前 ,先调用hasNext()探测是否迭代到终点
2、next方法不仅要返回当前元素,还要后移游标cursor
3、remove()方法用来删除最近一次已经迭代出的元素
4、 迭代出的元素是原集合中元素的拷贝(重要)
5、配合foreach使用
// Iterator接口的JDK源码,注释为整理建议使用Iterator的正确姿势
public interface Iterator<E> {
boolean hasNext(); // 每次next之前,先调用此方法探测是否迭代到终点
E next(); // 返回当前迭代元素 ,同时,迭代游标后移
/** 删除最近一次已近迭代出出去的那个元素。
只有当next执行完后,才能调用remove函数。
比如你要删除第一个元素,不能直接调用 remove() 而要先next一下( );
在没有先调用next 就调用remove方法是会抛出异常的。
这个和MySQL中的ResultSet很类似
*/
void remove() {
throw new UnsupportedOperationException("remove");
}
}
java中的集合的继承关系看书:《java核心技术卷I》