Java集合中关于Iterator和ListIterator的详解

Java集合中关于Iterator和ListIterator的详解
1.Iterator
Iterator的定义:public interface Iterator{}
是一个接口,是集合的迭代器,集合可以通过Iterator去遍历集合中的元素。
Iterator提供的API接口如下:
forEachRemaining(Consumer<?super E> action):为每个剩余元素执行给定的操作,直到所有的元素都已经被处理或行动将抛出一个异常;
hasNext():如果迭代器中还有元素,则返回true;
next():返回迭代器中的下一个元素;
remove():删除迭代器新返回的元素
boolean hasNext():判断是否有元素没有被遍历
Object next():返回游标当前位置的元素并将游标移动到下一个位置
void remove():删除游标左面的元素,在执行完next之后该操作只能执行一次

2.ListIterator
ListIterator是一个功能更加强大的,继承于Iterator接口只能用于各种List类型的访问
ListIterator特点:
(1)双向移动(向前/向后遍历)。
(2)产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引。
(3)可以使用set()方法替换它访问过的最后一个元素。
(4)可以使用add()方法在next()方法返回的元素之前或previous()方法返回的元素之后插入一个元素。
使用例子:

import java.util.*;
public class TestListIterator{
 
    public static void main(String[] args) {
 1       ArrayList<String> a = new ArrayList<String>();  //新建一个ArrayList,命名为a
 2       a.add("aaa");//往ArrayList里添加了aaa,bbb,ccc
 3       a.add("bbb");
 4       a.add("ccc");
 5       System.out.println("Before iterate : " + a);//输出ArrayList里的值:aaa,bbb,ccc
 6       ListIterator<String> it = a.listIterator()//调用了a的listIterator方法,并使ListIterator类型的it指向,也就是说ListIterator类型的it指向了ArrayList容器,通过调用ArrayList的listIterator方法来进行容器内的遍历。
 7       while (it.hasNext()) {
 8           System.out.println(it.next() + ", " + it.previousIndex() + ", " + it.nextIndex());
 9       }//调用it的hasNext()方法进行判断容器中是否还有元素,如果有,则输出元素,当前元素前一个元素的索引,当前元素后一个元素的索引
10        while (it.hasPrevious()) {//此时,it已经指向了ArrayList的最后一个元素,在这里调用了ListIterator的hasPrevious()方法,就是,开始往前遍历(上面是往后遍历),在这个while循环中,会依次输出:ccc bbb aaa
11            System.out.print(it.previous() + " ");
12        }
13        System.out.println();//输出换行
14        it = a.listIterator(1);//调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。现在it应该已经再一次指向ArrayList的开头,在这一行中,it又被用到了,同样的用到了ArrayList的listIterator方法,这一次不同,而是it指向了listIterator的第二个元素,因为是1,第一个元素的索引是0,也就是说it指向了ArrayList里的bbb,bbb是开头的元素
15        while (it.hasNext()) {//再一次调用了ListIterator的hasNext()方法,来判断ArrayList里是否还有元素。
16            String t = it.next();//调用了it的next()方法,所谓next方法,是指找到剩下元素的第一个元素,也就是bbb,并把它赋值了String的t
17            System.out.println(t);//输出bbb
18            if ("ccc".equals(t)) {
19                it.set("nnn");
20            } else {
21                it.add("kkk");//如果bbb与ccc相等则将bbb set成nnn,否则,add()来添加kkk,那么在哪里添加呢,是在next方法返回的元素之前,next方法返回的元素是ccc,也就是在bbb和ccc之间添加kkk。现在容器中有aaa、bbb、kkk以及ccc。返回到第15行,再次以此往下执行,会执行if判断,然后把ccc设置nnn.
22            }
23        }
24        System.out.println("After iterate : " + a);//最后输出ArrayList里的元素:aaa、bbb、kkk、nnn
    }
}

3.Iterator和ListIterator的区别
我们在使用List、Set的时候,为了实现对其数据的遍历,我们经常使用到了Iterator(迭代器)。使用迭代器,不需要干涉其遍历的过程,只需要每次取出一个你想要的数据进行处理就可以了。但是在使用的时候也是有不同的,List和Set都有iterator()来取得其迭代器。对List来说,你也可以通过ListIterator()取得其迭代器,两种迭代器在有些时候是不能通用的,Iterator和ListIterator主要区别在以下方面:
(1)ListIterator有add()方法,可以向List中添加对象,而Iterator不能。
(2)ListIterator和Iterator都有hasNext()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
(3)ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
(4)都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。
因为ListIterator的这些功能,可以实现对LinkedList等List数据结构的操作。其实,数组对象也可以用迭代器来实现。
参考自:(https://blog.csdn.net/weixin_39241397/article/details/79687789)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值