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接口
Iterator接口包含三个方法:
- public interface Iterator<E>{
- E next();
- boolean hasNext();
- void remove();
- }
- 一开始迭代器在所有元素的左边,调用next()之后,迭代器移到第一个和第二个元素之间,next()方法返回迭代器刚刚经过的元素。
- hasNext()若返回True,则表明接下来还有元素,迭代器不在尾部。
- remove()方法必须和next方法一起使用,功能是去除刚刚next方法返回的元素。
- package com.xujin;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Iterator;
- public class Test{
- public static void main(String...arg){
- Collection<String> a = new ArrayList<String>();
- a.add("Bob");
- a.add("Alice");
- a.add("Lisy");
- Iterator<String> iter = a.iterator();
- while(iter.hasNext()){
- String ele = iter.next();
- System.out.print(ele + " ");//Bob Alice Lisy
- }
- System.out.println();
- System.out.println(a);//[Bob, Alice, Lisy]
- Iterator<String> iter2 = a.iterator();
- iter2.next();
- iter2.remove();
- System.out.println(a);//[Alice, Lisy]
- }
- }
Iterable接口
Iterable接口仅包含一个方法:
- public interface Iterable<E>{
- Iterator<E> iterator();
- }
for-each循环可以与任何实现了Iterable接口的对象一起工作。
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.
|
实现Collection接口的每一个类都要实现以上众多方法,但开发者自己实现很麻烦。所以java提供了AbstractCollection类来编写具体的类。
以下类都实现了Collection接口:
AbstractCollection, AbstractList, AbstractQueue, AbstractSequentialList, AbstractSet, ArrayBlockingQueue, ArrayDeque, ArrayList, AttributeList, BeanContextServicesSupport, BeanContextSupport, ConcurrentLinkedDeque,ConcurrentLinkedQueue, ConcurrentSkipListSet, CopyOnWriteArrayList, CopyOnWriteArraySet, DelayQueue, EnumSet, HashSet, JobStateReasons, LinkedBlockingDeque, LinkedBlockingQueue, LinkedHashSet, LinkedList,LinkedTransferQueue, PriorityBlockingQueue, PriorityQueue, RoleList, RoleUnresolvedList, Stack, SynchronousQueue, TreeSet, Vector
Collection接口有三个常用的子接口,分别是List,Set,Queue。