迭代器
Iterator
定义
public interface Iterator<E>
常用方法及原理
迭代器是一个指向元素中间位置的指针,N个元素有N+1个合法的迭代器位置:
注:以下的叙述按照Java方法的语义,对于Next的方向,右边是“前”,左边是“后”。对于Previous方向,左边是“前”,右边是“后”
boolean hasNext()
原则:判断能不能向“前”移动
判断能不能向右移动一个位点
E next()
原则:向“前”移动,返回“后”面的元素
将迭代器向右移动一个位点,并返回该位点左边的元素,如果移动超出位点范围会抛出NoSuchElementException异常
default void remove()
原则:remove永远删掉“后”面的元素
删除当前位点左边的元素,删除的元素内容不能为空,否则会抛出IllegalStateException异常
常用如下写法遍历:
while(iterator.hasNwxt()){
iterator.next()
}
ListIterator
定义
public interface ListIterator<E>
常用方法及原理
跟Iterator一样,N个元素有N+1个合法的迭代器位置:
注:以下的叙述按照Java方法的语义,对于Next的方向,右边是“前”,左边是“后”。对于Previous方向,左边是“前”,右边是“后”
注:ListIterator继承Iterator的所有方法
boolean hasPrevious()
原则:判断能不能向“前”移动
判断能不能向左移动一个位点
E previous()
原则:向“前”移动,返回“后”面的元素
将迭代器向左移动一个位点,并返回该位点右边的元素,如果移动超出位点范围会抛出NoSuchElementException异常
default void remove()
(重写)
原则:remove永远删掉“后”面的元素
如果前一个操作是next
,则删除当前位点左边的元素。如果前一个操作是previous
,则删除当前位点右边的元素。删除的元素内容不能为空,否则会抛出IllegalStateException异常
void set(E e)
原则:set永远修改“后”面的元素
如果前一个操作是next
,则修改当前位点左边的元素。如果前一个操作是previous
,则修改当前位点右边的元素。修改的元素内容不能为空,否则会抛出NoSuchElementException异常
void add(E e)
原则:add永远在左边增加元素
在当前位点左边增加元素
长度变化的原则
remove
和add
方法会改变长度,导致各个元素的下标发生改变,后续进行set等其他操作可能会出错。为了避免这种错误,每一次使用这两个方法时都会把“前”一个元素位点记号标记为-1,此时直接进行其他操作会抛出异常,只用通过next
和previous
方法更新标记之后才能正常使用其他操作。
ForEach
增强for循环,利用迭代器来遍历数组和Collection集合
语法
for(数据类型 :变量名 集合或数组名)