Iterator是一个接口,他的实现类都会在类的内部定义一个iterator方法类
public Iterator<E> iterator() {
return new Itr();
}
可以看到方法中创建了一个Itr
对象,Itr
是一个内部类,可以方便的访问外部类中的成员。提供更小的封装性。
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
Itr() {}
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
有两个成员变量int cursor
,int lastRet = -1
相当于两个指针,int cursor
指向当前集合中的对象,指向上一个集合中对象
hasNext方法
返回值是一个boolean
,比较就是看是否遍历完了集合中的对象。
next方法
1.Object[] elementData = ArrayList.this.elementData;
把ArrayList
底层数组的引用赋值给一个Object数组。
2.cursor = i + 1;
当前指针加一。
3. return (E) elementData[lastRet = i];
返回一个对象
Iterator接口中的remove方法
1.首先明确在使用Iterator遍历数组的时候,是不可以调用List中的方法来进行对象的删除的。会引起异常。
2.遍历集合的时候可以使用for-each循环,其实它在遍历数组的时候底层使用的依然时Iterator。并且使用for-each循环说无法删除对象。如果用for-each循环遍历数组,他其实会使用for循环
3.正确遍历时删除集合中对象的代码:
while(it.hasNext()){
String elem=it.next();
if("hanhan".equals(elem)){
it.remove();
}
System.out.println(elem);
}
System.out.println(arrayList);
需要注意的是:你使用Iterator删除集合中对象的时候,他依然会把所以的对象都遍历出来,但其实集合中已经删除了。
那些类可以调用iterator方法
实现了Iterable
接口的类可以调用iterator方法。在Iterable
中就有抽象的iterator方法。