了解迭代器
迭代器模式
就是提供一种方法对一个容器对象中的各个元素进行访问,而又不暴露该对象容器的内部细节
比如对于数据的遍历
1 |
|
对ArrayList的处理
1 |
|
public interface Iterable
//返回一个迭代器
Iterator
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
default Spliterator
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
1 |
|
public interface Iterator
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException(“remove”);
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
1 |
|
public class Test {
public static void main(String[] args) {
ReverseList<String> list=new ReverseList();
list.add("111");
list.add("222");
list.add("333");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
class ReverseList
private List<T> list = new ArrayList<>();
public void add(T data) {
list.add(data);
}
@Override
public Iterator<T> iterator() {
return new ReverIterator(list.size());
}
private class ReverIterator implements Iterator<T> {
int index;
ReverIterator(int size) {
this.index = size;
}
@Override
public void remove() {
list.remove(index);
}
@Override
public boolean hasNext() {
return index>0;
}
@Override
public T next() {
index--;
return list.get(index);
}
}
}
1 |
|
ReverseList
list.add(“111”);
list.add(“222”);
list.add(“333”);
list.forEach(x-> System.out.println(x));
1 |
|
ReverseList
list.add(“111”);
list.add(“222”);
list.add(“333”);
Iterator
iterator.forEachRemaining(x-> System.out.println(x));
### 快速失败机制
当使用Iterator迭代访问Collection集合元素时,Collection集合里的元素不能被改变(**只有改变集合个数才会引发,使用list.set(index,element)方法改变某个元素时不会引发**),只有通过Iterator的remove()方法删除上一次next()方法返回的集合元素才可以,否则将会引发ModificationException异常.
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!