大话Iterator

    我们做集合相关的内容时 必不可少的是会遇到 Iterator这个单词 。今天我们来看一下它是什么?

一.Iterator

  • Iterator专门为遍历集合而生,集合并没有提供专门的遍历的方法
  • Iterator实际上迭代器设计模式的实现
  • Iterator的常用方法
    • boolean hasNext(): 判断是否存在另一个可访问的元素
    • Object next(): 返回要访问的下一个元素
    • void remove(): 删除上次访问返回的对象。
  • 哪些集合可以使用Iterator遍历
    • 层次1:Collection、List、Set可以、Map不可以
    • 层次2:提供iterator()方法的就可以将元素交给Iterator;
    • 层次3:实现Iterable接口的集合类都可以使用迭代器遍历
  • for-each循环和Iterator的联系
    • for-each循环(遍历集合)时,底层使用的是Iterator
    • 凡是可以使用for-each循环(遍历的集合),肯定也可以使用Iterator进行遍历
  • for-each循环和Iterator的区别
    • for-each还能遍历数组,Iterator只能遍历集合
    • 使用for-each遍历集合时不能删除元素,会抛出异常ConcurrentModificationException使用Iterator遍历合时能删除元素
  • Iterator是一个接口,它的实现类在哪里?
    在相应的集合实现类中 ,比如在ArrayList中存在一个内部了Itr implements Iterator
  • 为什么Iterator不设计成一个类,而是一个接口
    不同的集合类,底层结构不同,迭代的方式不同,所以提供一个接口,让相应的实现类来实现

使用Iterator迭代集合

public class TestIterator {
    public static void main(String[] args) {      
        //创建一个集合对象
        ArrayList<Integer> list = new ArrayList<Integer>();   
        //向集合中添加分数
        list.add(78);
        list.add(80);
        list.add(89);
        System.out.println(list);
        Iterator<Integer> it = list.iterator();
        while(it.hasNext()){
            int elem = it.next();
            if(elem == 78){
                //list.remove(new Integer(78));
                it.remove();
            }
            //System.out.println(elem);
        }
        System.out.println(list);
//    for(int elem:list){
//       if(elem == 78){
//          list.remove(new Integer(78));// 	
//       }
//       System.out.println(elem);
//    }        
    }
}
  • Iterator到底是怎么工作的;不同集合的遍历有Iterator的不同的实现类完成,以Iterator遍历ArrayList为例进行说明
public Iterator<E> iterator() {
    return new Itr();
}
private class Itr implements Iterator<E> {
    int cursor;      
    int lastRet = -1;   
    public boolean hasNext() {
        return cursor != size;
    }
    public E next() {
       int i = cursor;
       Object[] elementData = ArrayList.this.elementData;
       cursor = i + 1;
        return (E) elementData[lastRet = i];
    }
}

在这里插入图片描述

二.ListIterator

  • ListIterator和Iterator的关系
    • public interface ListIterator extends Iterator
    • 都可以遍历List
  • ListIterator和Iterator的区别?
    • 使用范围不同
      • Iterator可以应用于更多的集合,Set、List和这些集合的子类型。
      • ListIterator只能用于List及其子类型。
    • 遍历顺序不同
      • Iterator只能顺序向后遍历; ListIterator还可以逆序向前遍历
      • Iterator可以在遍历的过程中remove();ListIterator可以在遍历的过程中remove()、add()、set()
    • ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。

ListIterator遍历List

public class TestListIterator {
    public static void main(String[] args) {
        //创建一个集合对象
        List<Integer> list = new ArrayList<Integer>();
        //向集合中添加分数
        list.add(78);
        list.add(80);
        list.add(89);        
        ListIterator<Integer> lit = list.listIterator();        
        while(lit.hasNext()){
            lit.next();
        }        
        while(lit.hasPrevious()){
            int elem = lit.previous();
            System.out.println(elem +"  "+lit.nextIndex()
+"  "+lit.previousIndex());
        }
    }
}

ps:如有帮助请点赞 关注。有问题 想要获取学习资料添加qq:1184905186

发布了320 篇原创文章 · 获赞 152 · 访问量 64万+

猜你喜欢

转载自blog.csdn.net/hello_word2/article/details/105015860