java对List集合的迭代方式Iterator/ListIterator

其实下面用的方法的原理用单向链表和双向链表的思路去想,就会发现一切都是那么的自然

Iterator

Iterator 的方法:

方法 功能

  • hasNext() 判断集合列表中是否还有可以迭代的元素
  • next() 返回下一个元素
  • remove() 移除最近返回的一个元素
ArrayList<Character> list = new ArrayList<>();
for (char c = 'A'; c <= 'G'; c++) {
    
    
    list.add(c);
}
 
Iterator<Character> it = list.iterator();
while (it.hasNext()) {
    
    
    char c = it.next(); // next() 返回下一个元素
    if (c == 'C') {
    
    
        it.remove(); // remove() 移除元素
    } 
}
运行结果 :[A, B, D, E, F, G]

ListIterator

ListIterator 的方法

方法 功能

  • hasNext() 判断是否还有下一个元素可以迭代
  • next() 返回下一个元素
  • hasPrevious() 判断是否还有上一个元素可以迭代
  • previous() 返回上一个元素
  • add() 添加一个元素,会加到当前元素的后一个位置
  • set(E e) 用指定的元素替换最近返回的元素
  • remove() 移除最近返回的元素
//[0,1,2,3]
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i <= 3; i++) {
    
    
    list.add(i);
}
 
ListIterator<Integer> li = list.listIterator();
boolean flag = true;
// 如果是正序迭代 或者 有前一个可以迭代的元素
while (flag || li.hasPrevious()) {
    
    
    int index = 0;
    int ele = 0;
    if (flag) {
    
    
        index = li.nextIndex();  // nextIndex() 返回下一个元素的索引
        ele = li.next();         // next() 返回下一个元素
    } else {
    
    
        index = li.previousIndex(); // previousIndex 返回上一个元素的索引
        ele = li.previous();        // previous() 返回上一个元素
    }
    if (ele == 1) {
    
    
        // 如果迭代到的元素是 1 ,则将该元素替换成 0
        li.set(0); // set() 用指定元素替换最后返回的元素
    } else if (ele == 3) {
    
    
    // remove() 移除最后返回的元素
    //和下面的add类似,如果使用了获取下标方法,这个时候原list,元素3后面的元素的下标都会 -1
        li.remove(); 
    }
    System.out.println("(" + index + ") = " + ele);
    
    // 判断是否还有下一个可以迭代的元素
    if (!li.hasNext()) {
    
    
        flag = false;
        // add() 添加一个元素,会加到当前元素的后一个位置
        // 此时迭代的时候还是迭代之前的元素,这个新加的元素不会参与进来
        // 但是如果代码里有使用 li.nextIndex() 获取下标的方法,这个时候因为新加了一个元素,对于当前的这个demo来说,就是0和1之前插入了一个值为10,这个时候1的下标其实变成了2,其余元素的下标依次递增 + 1
        li.add(10);
    }
}

Iterator 和 ListIterator 主要区别

  • ListIterator有add()方法,可以向List中添加对象,而Iterator不能
  • ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
  • ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
  • ListIterator 可以再迭代时对集合进行add、set、remove操作,而Iterator迭代器只能在迭代时对集合进行
    remove 操作

猜你喜欢

转载自blog.csdn.net/weixin_43944305/article/details/113644622