JAVA-容器-Iterable和ListIterator

Iterable
Iterable是一个接口,被Collection所继承。它只有一个方法: Iterator<T> iterator() //即返回一个迭代器。

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为**“轻量级”**对象,因为创建它的代价小。

Java中的Iterator功能比较简单,并且只能单向移动。

使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

Iterator在遍历过程中使用了锁定,只有他自己能动,所以使用remove方法可行性更高。

    public static void main(String[] args) {
        List<String> l = new ArrayList<String>();
        l.add("aa");
        l.add("bb");
        l.add("cc");
        Iterator iter = l.iterator();
        while(iter.hasNext()){//判断是否有元素没有被遍历
            System.out.println((String)iter.next());//返回游标当前位置元素,并将游标移动到下一个位置
            iter.remove();//删除游标左边的元素(仅能执行一次)
        }
    }
JDK
Modifier and TypeMethod and Description
default voidforEachRemaining(Consumer<? super E> action)

对每个剩余元素执行给定的操作,直到所有元素都被处理或动作引发异常。

booleanhasNext()

如果迭代具有更多元素,则返回 true

Enext()

返回迭代中的下一个元素。

default voidremove()

从底层集合中删除此迭代器返回的最后一个元素(可选操作)。


ListIterator

它继承于Iterator接口,只能用于各种List类型的访问。可以通过调用listIterator()方法产生一个指向List开始处的ListIterator。

双向移动(向前/向后遍历).

产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引。

可以使用set()方法替换它访问过的最后一个元素。

可以使用add()方法在next()方法返回的元素之前或previous()方法返回的元素之后插入一个元素。

  public static void main(String[] args) {
        List<String> a = new ArrayList<String>();
        a.add("aaa");
        a.add("bbb");
        a.add("ccc");
        System.out.println("Before iterate : " + a);//[aaa, bbb, ccc]
        ListIterator<String> it = a.listIterator();
        while (it.hasNext()) {
            System.out.println(it.next() + ", " + it.previousIndex() + ", " + it.nextIndex());//aaa, 0, 1   bbb, 1, 2   ccc, 2, 3
        }
        while (it.hasPrevious()) {
            System.out.print(it.previous() + " ");//ccc bbb aaa
        }
        System.out.println();
        it = a.listIterator(1);//调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。
        while (it.hasNext()) {
            String t = it.next();
            System.out.println(t);//第一次循环:bbb 第二次循环:ccc
            if ("ccc".equals(t)) {
                it.set("nnn");
            } else {
                it.add("kkk");
            }
        }
        System.out.println("After iterate : " + a);//After iterate : [aaa, bbb, kkk, nnn]
    }
JDK
Modifier and TypeMethod and Description
voidadd(E e)

将指定的元素插入列表(可选操作)。

booleanhasNext()

返回 true如果遍历正向列表,列表迭代器有多个元素。

booleanhasPrevious()

返回 true如果遍历反向列表,列表迭代器有多个元素。

Enext()

返回列表中的下一个元素,并且前进光标位置。

intnextIndex()

返回随后调用 next()返回的元素的索引。

Eprevious()

返回列表中的上一个元素,并向后移动光标位置。

intpreviousIndex()

返回由后续调用 previous()返回的元素的索引。

voidremove()

从列表中删除由 next()previous()返回的最后一个元素(可选操作)。

voidset(E e)

指定的元素替换由 next()previous()返回的最后一个元素(可选操作)。

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值