java Iterator
Iterator是集合的迭代器,在java 集合类中,是 Enumeration 的替代品,它和 Enumeration 有两个区别
- 允许调用者在iteratoe 删除所指向的Collection中的元素, Enumeration 则不行
- 方法名被改进了
Iterator 中只有3个方法,hasNext() , next() , remove()
java 中因为Collection实现了 Iterable, 所以list 和 set 都有了Iterator iterator()这个方法
Iterator 最重要的一点的是,能够对集合进行遍历时修改集合,一般的for循环是做不到的
ArrayList 中的实现(7u40-b43)
/**ArrayList 中定义了内部类Itr
*class Itr implements Iterator<E>
*重写了iterator方法,返回这个内部类 Itr
*/
813 public Iterator<E> iterator() {
814 return new Itr();
815 }
// 看一下Itr的实现代码
private class Itr implements Iterator<E> {
//cursor 相当于遍历的标示,标示下一个位置
821 int cursor; // index of next element to return
//lastRet就是当前的位置,通常来说,lastRet 比 cursor 小1 ,当调用remove后lastRet会被置为-1d
822 int lastRet = -1; // index of last element returned; -1 if no such
823 int expectedModCount = modCount;
824
825 public boolean hasNext() {
// cursor标示的是下一个位置,如果下一个位置是数组的长度,则表示后面没有数据了,好理解
826 return cursor != size;
827 }
828
829 @SuppressWarnings("unchecked")
830 public E next() {
831 checkForComodification();
832 int i = cursor;
833 if (i >= size)
834 throw new NoSuchElementException();
835 Object[] elementData = ArrayList.this.elementData;
836 if (i >= elementData.length)
837 throw new ConcurrentModificationException();
// 以访问第一个元素为例 cursor = 1 lastRet = 0 获取list数组的第0个元素
838 cursor = i + 1;
839 return (E) elementData[lastRet = i];
840 }
841
842 public void remove() {
//在删除前,必须要进行next 操作
843 if (lastRet < 0)
844 throw new IllegalStateException();
845 checkForComodification();
846
847 try {
848 ArrayList.this.remove(lastRet);
849 cursor = lastRet;
850 lastRet = -1;
851 expectedModCount = modCount;
852 } catch (IndexOutOfBoundsException ex) {
853 throw new ConcurrentModificationException();
854 }
855 }
856
857 final void checkForComodification() {
858 if (modCount != expectedModCount)
859 throw new ConcurrentModificationException();
860 }
861 }
// 从上面的代码分析,如果在remove前不调用next 方法,是会报错的
// 从demo中运行,认证了上面的说法
ArrayList list = new ArrayList<String>();
list.add("111");
list.add("222");
list.add("333");
Iterator<String> itr = list.iterator();
while(itr.hasNext()){
itr.remove(); // 这里会报错,因为没有调用next 方法 //java.lang.IllegalStateException
}