Java Iterable interface and Iterator
Java Iterable interface and Iterator iterator Iterator
The interface is defined as follows:
public interface Iterator
{ boolean hasNext(); E next(); void remove();}
This interface only contains three functions. The hasNext () and next () methods appear in our common set traversal.
Functions:
Use next () to obtain the next element in the sequence. Use hasNext () to check whether there are any elements in the sequence. Use remove () to delete the elements returned by the iterator.
For a set that has implemented the iterator interface, the traversal set is generally written
For example, the list set, which we commonly use, has implemented the iterator interface.
-Method 1:
list l = new ArrayList(); l.add(aa); l.add(bb); l.add(cc); for (Iterator iter = l.iterator(); iter.hasNext();) { String str = (String)iter.next(); System.out.println(str); }
Method 2: while
Iterator iter = l.iterator(); while(iter.hasNext()){ String str = (String) iter.next(); System.out.println(str); }
Here, let's look at the javasactlist source code. The iterator implementation details are in the middle. The iter above is actually a polymorphism, And the iterator method in the list abstract javasactlist class is called:
private class Itr implements Iterator
{ int cursor = 0; int lastRet = -1; int expectedModCount = modCount; public boolean hasNext() { return cursor != size(); } public E next() { checkForComodification(); try { int i = cursor; E next = get(i); lastRet = i; cursor = i + 1; return next; } catch (IndexOutOfBoundsException e) { checkForComodification(); throw new NoSuchElementException(); } } public void remove() { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { AbstractList.this.remove(lastRet); if (lastRet < cursor) cursor--; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException e) { throw new ConcurrentModificationException(); } } final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } }
Through the source code, we can see more clearly the implementation mechanism of the three functions of iterator. careful readers may find that expectedModCount = modCount; In the move () method has such an expression. This is actually a fast Failure Mechanism in the list. The addition and deletion of modcount in the arraylist changes the value, and expectedModcount is the value maintained in the traversal. If the two are not equal, a write operation occurs during the traversal. This causes data inconsistency.
For details, refer to the blog [ConcurrentModificationException] [1].
The benefits of using iterator can be summarized as follows:
**
Encapsulate the internal implementation details of the container. For different sets, the same Traversal method can be provided to simplify client access and obtain data in the container.
**
Iterable
The interface is defined as follows:
public interface Iterable
{ /** * Returns an iterator over a set of elements of type T. * * @return an Iterator. */ Iterator
iterator();}
Java SE5 introduces the Iterable interface, which contains an Iterator () method that can generate iterator, And the Iterable interface is used by foreach to move in the sequence. Therefore, any custom class that implements Iterable can be used in the foreach statement.
Iterable is mainly used to implement the Iterable interface to implement custom classes suitable for foreach traversal.
Let's look at a simple example:
package com.andieguo.iterabledemo;import java.util.Iterator;public class IterablerClass
implements Iterable
{ private T[] array = null; public IterablerClass(T[] t){ this.array = t ; } @Override public Iterator
iterator() { // TODO Auto-generated method stub return new Iterator
() { private Integer index = 0; @Override public boolean hasNext() { // TODO Auto-generated method stub return index iterablerClass = new IterablerClass
(new String[]{hello,world,today,happy,sorrow}); for(String s:iterablerClass){ System.out.print(s+ ); } }}