Iterator、Iterable接口的使用及详解
来源:互联网 发布:java web经典面试题 编辑:程序博客网 时间:2024/06/08 09:55
Iterator、Iterable接口的使用及详解
Java集合类库将集合的接口与实现分离。同样的接口,可以有不同的实现。
Java集合类的基本接口是Collection接口。而Collection接口必须实现Iterator接口。
以下图表示集合框架的接口,java.lang以及java.util两个包里的。其他部分可以从左向右看,比如Collection的Subinterfaces有List,Set以及Queue等。
package java.util;/** * An iterator over a collection. Iterator takes the place of Enumeration in * the Java collections framework. Iterators differ from enumerations in two * ways: <ul> * <li> Iterators allow the caller to remove elements from the * underlying collection during the iteration with well-defined * semantics. * <li> Method names have been improved. * </ul><p> * * This interface is a member of the * <a href="{@docRoot}/../technotes/guides/collections/index.html"> * Java Collections Framework</a>. * * @author Josh Bloch * @version %I%, %G% * @see Collection * @see ListIterator * @see Enumeration * @since 1.2 */public interface Iterator<E> { /** * Returns <tt>true</tt> if the iteration has more elements. (In other * words, returns <tt>true</tt> if <tt>next</tt> would return an element * rather than throwing an exception.) * * @return <tt>true</tt> if the iterator has more elements. */ boolean hasNext(); /** * Returns the next element (每一次迭代,the next element就是index为0的元素)in the iteration. * * @return the next element in the iteration. * @exception NoSuchElementException iteration has no more elements. */ E next(); /** * * Removes from the underlying collection the last element returned by the * iterator (optional operation). This method can be called only once per * call to <tt>next</tt>. The behavior of an iterator is unspecified if * the underlying collection is modified while the iteration is in * progress in any way other than by calling this method. * * @exception UnsupportedOperationException if the <tt>remove</tt> * operation is not supported by this Iterator. * @exception IllegalStateException if the <tt>next</tt> method has not * yet been called, or the <tt>remove</tt> method has already * been called after the last call to the <tt>next</tt> * method. */ void remove();}
以下例子是利用了Iterator接口的着三个方法,实现遍历ArrayList<String>类型。
一开始迭代器在所有元素的左边,调用next()之后,迭代器移到第一个和第二个元素之间,next()方法返回迭代器刚刚经过的元素。
hasNext()若返回True,则表明接下来还有元素,迭代器不在尾部。
remove()方法必须和next方法一起使用,功能是去除刚刚next方法返回的元素。
import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;public class ForEachDemo { public static void main(String... arg) { Collection<String> a = new ArrayList<String>(); a.add("Bob"); a.add("Alice"); a.add("Lisy"); Iterator<String> iterator = a.iterator(); while (iterator.hasNext()) { String ele = iterator.next(); System.out.println(ele);//Bob Alice Lisy } System.out.println(a);//[Bob, Alice, Lisy] iterator = a.iterator(); iterator.next(); iterator.remove(); System.out.println(a);//[Alice, Lisy] }}
package java.lang;import java.util.Iterator;/** Implementing this interface allows an object to be the target of * the "foreach" statement. * @since 1.5 */public interface Iterable<T> { /** * Returns an iterator over a set of elements of type T. * * @return an Iterator. */ Iterator<T> iterator();}
for-each循环可以与任何实现了Iterable接口的对象一起工作。
而Collection接口扩展了Iterable接口,故标准类库中的任何集合都可以使用for-each循环。
Collection接口
此接口的方法
public interface Collection<E>{......}
boolean
add(E e)
boolean
addAll(Collection<? extends E> c)
void
clear()
boolean
contains(Object o)
boolean
containsAll(Collection<?> c)
boolean
equals(Object o)
int
hashCode()
boolean
isEmpty()
Iterator<E>
iterator()
boolean
remove(Object o)
boolean
removeAll(Collection<?> c)
boolean
retainAll(Collection<?> c)
int
size()
Object[]
toArray()
<T> T[]
toArray(T[] a)
因为其中有一个返回值为Iterator<E>类型的iterator()方法,所以,Collection接口必须实现Iterator接口
实现Collection接口的每一个类都要实现以上众多方法,但开发者自己实现很麻烦。所以java提供了AbstractCollection类来编写具体的类。
java.util
Interface Collection<E>
- All Superinterfaces:
- Iterable<E>
- All Known Subinterfaces:
- BeanContext, BeanContextServices, BlockingDeque<E>, BlockingQueue<E>, Deque<E>, List<E>, NavigableSet<E>, Queue<E>, Set<E>, SortedSet<E>
- All Known Implementing Classes:
- AbstractCollection, AbstractList, AbstractQueue, AbstractSequentialList, AbstractSet, ArrayBlockingQueue, ArrayDeque, ArrayList, AttributeList, BeanContextServicesSupport, BeanContextSupport, ConcurrentLinkedQueue, ConcurrentSkipListSet, CopyOnWriteArrayList, CopyOnWriteArraySet, DelayQueue, EnumSet, HashSet, JobStateReasons, LinkedBlockingDeque, LinkedBlockingQueue, LinkedHashSet, LinkedList, PriorityBlockingQueue, PriorityQueue, RoleList, RoleUnresolvedList, Stack, SynchronousQueue, TreeSet, Vector
Collection接口有三个常用的子接口,分别是List,Set,Queue。
http://blog.csdn.net/xujinsmile/article/details/8543544
看一下JDK中的集合类,比如List一族或者Set一族,
都是实现了Iterable接口,但并不直接实现Iterator接口。
仔细想一下这么做是有道理的。因为Iterator接口的核心方法next()或者hasNext()
是依赖于迭代器的当前迭代位置的。
如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。
当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。
除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。
但即时这样,Collection也只能同时存在一个当前迭代位置。
而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。
多个迭代器是互不干扰的。
http://www.cnblogs.com/highriver/archive/2011/07/27/2077913.html
import java.util.Iterator;public class ForEachAPIDemo { public static void main(String[] args) throws Exception { Students students = new Students(10); for (Student student : students) { System.out.println(student.getSid() + ":" + student.getName()); } }}// 支持for each迭代循环的学生集合类class Students implements Iterable<Student> { // 存储所有学生类的数组 private Student[] students; // 该构造函数可以生成指定大小的学生类变量数组,并初始化该学生类变量数组 public Students(int size) { students = new Student[size]; for (int i = 0; i < size; i++) { students[i] = new Student(String.valueOf(i), "学生" + String.valueOf(i)); } } @Override public Iterator<Student> iterator() { return new StudentIterator(); } // 实现Iterator接口的私有内部类,外界无法直接访问 private class StudentIterator implements Iterator<Student> { // 当前迭代元素的下标 private int index = 0; // 判断是否还有下一个元素,如果迭代到最后一个元素就返回false public boolean hasNext() { return index != students.length; } @Override public Student next() { return students[index++]; } // 这里不支持,抛出不支持操作异常 public void remove() { throw new UnsupportedOperationException(); } }}class Student { private String sid; private String name; public Student(String sid, String name) { setSid(sid); setName(name); } public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student{" + "sid='" + sid + '\'' + ", name='" + name + '\'' + '}'; }}
- Iterator、Iterable接口的使用及详解
- Iterable、Iterator接口及增强型for循环的总结
- Iterator接口和Iterable接口的区别
- Iterator 和 Iterable 接口的区别
- iterable和iterator接口的区别
- iterator与iterable接口之间的区别
- Iterator与Iterable接口
- Iterator和Iterable接口
- 3、Iterator、Iterable详解
- 接口 Iterable ,类是 Iterator
- Iterable接口和Iterator迭代器
- Iterator和Iterable的 新理解--一个神奇的接口
- 迭代中Iterable和Iterator分为两个接口的好处
- Java中接口Iterable与Iterator的区别
- java中的接口Iterator和Iterable的区别
- Java iterator iterable comparable comparator等接口设计的区别
- Java迭代器:iterator和iterable接口的区别
- 接口 Iterator<E> 与 接口 Iterable<T>
- C语言结构体变量和结构体变量的指针作函数参数例题
- java-Socket实现多线程服务器程序
- SAX解析XML文件
- IO流
- Python装饰器----应用示例(一)
- Iterator、Iterable接口的使用及详解
- 接口
- Sunscreen POJ
- HAProxy知识总结
- MyFlag Step13:打卡功能的初步讨论
- c语言web服务器
- session cookie原理
- 学习Python爬虫
- 623. Add One Row to Tree(Difficulty: Medium)