在 java 集合类库中将集合的接口与实现相分离。同样的接口,可以有不同类型的实现,这样就组成了多种不同的集合类型,他们都是实现了 Collection 接口,Map 除外。
java 集合类的基本接口是 Collection 接口,而 Collection 接口必须实现 Iterable 接口,而不是 Iterator 这个接口。(具体原因就是他们的区别,下面会讲到)
Iterable 是接口,他和迭代器是紧密相连的,Iterator 是迭代器,用来遍历集合的。集合类实现了 Iterable 接口后,Iterable 有一个方法 Iterator<T> iterator(),调用这个方法就可以返回一个 Iterator 类型,然后就可以遍历集合了。
Map 没有实现 Iterable 接口,而Map也就没有 Iterator()这个方法,但是 Map 有 keySet()和 entryset()方法,这两个方法可以转成set,set有可以生成 Iterator 对象的方法。
Iterator 和 Iterable 的关系
Iterator 内部有遍历集合的方法,Iterator是迭代器,之所以出现 Iterator 是为了解决遍历集合时,从不同类型的集合类中抽象出来,从而避免我们在操作集合的时候必须要根据集合内部结构来选择我们应该如何遍历。
比如:假设没有Iterator,遍历一ArryList 的方法
for(int i=0;i<array.size();i++){
}
而如果是链表的时候必须要用While循环
while ((linkedList =linkedList.next())!=null){
}
比如别的类型的集合的时候可能还有有别的遍历方法。这样就造成了我们如果要遍历集合的时候必须要知道集合的内部结构,这样会使的遍历的代码和集合本身的耦合度很高!!在编程中我们应该尽量降低代码的耦合度,使代码方便日后管理,和适应需求变化。在JAVA中为了解决这个问题引入了 Iterator,Iterator 在遍历不同的集合的时候方式总是一样的。
想用 Iterator 来遍历集合,则这个集合通常要实现 Iterable 接口而不是 Iterator,在 Iterable 中有一个非常重要的方法就是Iterator《T》iterator()方法,这个方法返回Iterator对象,然后通过这个对象进行遍历。
那么有人可能会产生疑问了,为什么我们不直接Implement Iterator 呢?
如果 Collection 直接实现 Iterator 这个接口的时候,则当我们new 一个新的对象的时候,这个对象中就包含了当前迭代位置的数据(指针),当这个对象在不同的方法或者类中传递的时候,当前传递的对象的迭代的位置是不可预知的,那么我们在调用next()方法的时候也就不知道是指到那一个元素。如果其中加上了一个reset()方法呢?用来重置当前迭代的位置这样Collection也只能同时存在一个当前迭代位置的对象。所以不能直接选择实现 Iterator。 实现Iterable ,里面的方法 Iterator() 可以在同一个对象每次调用的时候都产生一个新的 Iterator 对象。这样多个迭代器就不会互相干扰了。