Iterator 和 Iterable 接口的区别

时间:2023-02-17 16:03:46
java.lang.Iterable 
java.util.Iterator 

来自百度知道: 
Iterator是迭代器类,而Iterable是接口。 
好多类都实现了Iterable接口,这样对象就可以调用iterator()方法。 
一般都是结合着用,比如 
HashMap类就实现了Iterable接口,而要访问或打印出Map中所有内容时,就可以这样: HashMap hashMap; 
Iterator iter = hashMap.iterator(); 
while(iter.hashNext()) { 
  String s = iter.next(); 


转至:http://liuyun025.iteye.com/blog/1321045 
为什么一定要实现Iterable接口,为什么不直接实现Iterator接口呢? 
      看一下JDK中的集合类,比如List一族或者Set一族,都是实现了Iterable接口,但并不直接实现Iterator接口。 
仔细想一下这么做是有道理的。 

      因为Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。 
      如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。 
      当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。 
      除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。 
      但即时这样,Collection也只能同时存在一个当前迭代位置。 
      而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。 

      多个迭代器是互不干扰的。

Java集合类库将集合的接口与实现分离。同样的接口,可以有不同的实现。

Java集合类的基本接口是Collection接口。而Collection接口必须实现Iterator接口。

以下图表示集合框架的接口,java.lang以及java.util两个包里的。红色字体部分是OCJP考纲要求的接口。其他部分可以从左向右看,比如Collection的Subinterfaces有List,Set以及Queue等。

Iterator 和 Iterable 接口的区别

Iterator接口

Iterator接口包含三个方法:

[java] view plaincopy
  1.   public interface Iterator<E>{  
  2.     E next();  
  3.     boolean hasNext();  
  4.     void remove();  
  5. }  
以下例子是利用了Iterator接口的着三个方法,实现遍历ArrayList<String>类型。

  • 一开始迭代器在所有元素的左边,调用next()之后,迭代器移到第一个和第二个元素之间,next()方法返回迭代器刚刚经过的元素。
  • hasNext()若返回True,则表明接下来还有元素,迭代器不在尾部。
  • remove()方法必须和next方法一起使用,功能是去除刚刚next方法返回的元素。

[java] view plaincopy
  1. package com.xujin;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Collection;  
  5. import java.util.Iterator;  
  6.   
  7. public class Test{  
  8.     public static void main(String...arg){  
  9.         Collection<String> a = new ArrayList<String>();  
  10.         a.add("Bob");  
  11.         a.add("Alice");  
  12.         a.add("Lisy");  
  13.           
  14.         Iterator<String> iter = a.iterator();  
  15.         while(iter.hasNext()){  
  16.             String ele = iter.next();  
  17.             System.out.print(ele + "  ");//Bob  Alice  Lisy    
  18.         }  
  19.         System.out.println();  
  20.           
  21.         System.out.println(a);//[Bob, Alice, Lisy]  
  22.         Iterator<String> iter2 = a.iterator();  
  23.         iter2.next();  
  24.         iter2.remove();  
  25.         System.out.println(a);//[Alice, Lisy]  
  26.           
  27.     }  
  28. }  


Iterable接口

Iterable接口仅包含一个方法:

[java] view plaincopy
  1. public interface Iterable<E>{  
  2.     Iterator<E> iterator();  
  3. }  

for-each循环可以与任何实现了Iterable接口的对象一起工作。

而Collection接口扩展了Iterable接口,故标准类库中的任何集合都可以使用for-each循环。


Collection接口

此接口的方法

public interface Collection<E>{......}

 
Modifier and Type Method and Description
boolean add(E e)Ensures that this collection contains the specified element (optional operation).
boolean addAll(Collection<?
extends E> c)
Adds all of the elements in the specified collection to this collection (optional operation).
void clear()Removes all of the elements from this collection (optional operation).
boolean contains(Object o)Returns true if this collection contains the specified element.
boolean containsAll(Collection<?> c)Returns true if this collection contains all of the elements in the specified collection.
boolean equals(Object o)Compares the specified object with this collection for equality.
int hashCode()Returns the hash code value for this collection.
boolean isEmpty()Returns true if this collection contains no elements.
Iterator<E> iterator()Returns an iterator over the elements in this collection.
boolean remove(Object o)Removes a single instance of the specified element from this collection, if it is present (optional operation).
boolean removeAll(Collection<?> c)Removes all of this collection's elements that are also contained in the specified collection (optional operation).
boolean retainAll(Collection<?> c)Retains only the elements in this collection that are contained in the specified collection (optional operation).
int size()Returns the number of elements in this collection.
Object[] toArray()Returns an array containing all of the elements in this collection.
<T> T[] toArray(T[] a)Returns an array containing all of the elements in this collection; the runtime type of the returned array is that of the specified array.
因为其中有一个返回值为Iterator<E>类型的iterator()方法,所以,Collection接口必须实现Iterator接口

实现Collection接口的每一个类都要实现以上众多方法,但开发者自己实现很麻烦。所以java提供了AbstractCollection类来编写具体的类。

以下类都实现了Collection接口:

AbstractCollection, AbstractList, AbstractQueue, AbstractSequentialList, AbstractSet, ArrayBlockingQueue, ArrayDequeArrayList, AttributeList, BeanContextServicesSupport, BeanContextSupport, ConcurrentLinkedDeque,ConcurrentLinkedQueue, ConcurrentSkipListSet, CopyOnWriteArrayList, CopyOnWriteArraySet, DelayQueue, EnumSetHashSet, JobStateReasons, LinkedBlockingDeque, LinkedBlockingQueue, LinkedHashSetLinkedList,LinkedTransferQueue, PriorityBlockingQueue, PriorityQueue, RoleList, RoleUnresolvedList, Stack, SynchronousQueue, TreeSet, Vector



Collection接口有三个常用的子接口,分别是List,Set,Queue。