Java 中的Iterator再认知

Java代码写了不少,但是就是碎片化的,现在系统的整理一下;

背景

在遍历集合的时候,经常使用Iterator和ListIterator,下面就解析一下两者的异同点。

相同点

  1. 都是迭代器,当需要对集合中元素进行遍历不需要干涉其遍历过程时,这两种迭代器都可以使用。

不同点

  1. 使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。
  2. ListIterator有add方法,可以向List中添加对象,而Iterator不能。
  3. ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。
  4. ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
  5. 都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。

代码示例 

1.IteratorInterface.java

package javacollection.iterator;


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @ClassName IteratorInterface
 * @Author zhangqx02
 * @Date 2019/9/6 9:26
 * @Description
 *
 * 迭代器接口
 *  Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型
 *
 *  *方法摘要
 *  *boolean	hasNext()
 *  *如果仍有元素可以迭代,则返回 true。
 *  *
 *  *E	next()
 *  *返回迭代的下一个元素。
 *  *
 *  *void	remove()
 *  *从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
 */

public class IteratorInterface {

    public static void main(String[] args){
        List<String> list  = new ArrayList<>();

        list.add("Java");
        list.add("is");
        list.add("a");
        list.add("very");
        list.add("useful");
        list.add("language");
        list.add("!");

        System.out.println("list: "+ list);

        Iterator<String> iterator = list.iterator();
        StringBuffer sb = new StringBuffer();
        while (iterator.hasNext()){
            String str = iterator.next()+" ";
            sb.append(str);
        }

        System.out.println("sb: "+ sb.toString());
    }
}

2.listIteratorInterface.java

package javacollection.iterator;

import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

/**
 * @ClassName listIteratorInterface
 * @Author zhangqx02
 * @Date 2019/9/6 9:26
 * @Description
 * 迭代器接口
 * ListIterator只能用于List及其子类型。
 *
 * * void	add(E e)
 * * 将指定的元素插入列表(可选操作)。
 * * boolean	hasNext()
 * * 以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。
 * * boolean	hasPrevious()
 * * 如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。
 * * E	next()
 * * 返回列表中的下一个元素。
 * * int	nextIndex()
 * * 返回对 next 的后续调用所返回元素的索引。
 * * E	previous()
 * * 返回列表中的前一个元素。
 * * int	previousIndex()
 * * 返回对 previous 的后续调用所返回元素的索引。
 * * void	remove()
 * * 从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。
 * * void	set(E e)
 * * 用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。
 */

public class listIteratorInterface {
    public static void main(String[] args){
        List<String> list = new LinkedList<>();


        list.add("Java");
        list.add("is");
        list.add("a");
        list.add("very");
        list.add("useful");
        list.add("language");
        list.add("!");

        System.out.println("Before list: "+ list);

        ListIterator iterator = list.listIterator();

        System.out.println("Next: ");
        //以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)
        while (iterator.hasNext()){
            //返回对 next 的后续调用所返回元素的索引
            int index = iterator.nextIndex();
            //返回列表中的下一个元素
            String str = String.valueOf(iterator.next());
            if ("!".equals(str)){
                break;
            }else{
                System.out.println(str + " " + index);
            }


        }
        System.out.println();

        System.out.println("Previous: ");
        //果以逆向遍历列表,列表迭代器有多个元素,则返回 true。
        while (iterator.hasPrevious()){
            //返回对 previous 的后续调用所返回元素的索引。
            int index = iterator.previousIndex();
            //返回列表中的前一个元素。
            String str = String.valueOf(iterator.previous());

            if ("is".equals(str)){
                //用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)
                 iterator.set("IS");
            }
            System.out.println(str + " " +index);
        }
        System.out.println();

        //从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)
        iterator.remove();
        System.out.println("list: "+list);

        //将指定的元素插入列表(可选操作)
        iterator.add("java");
        System.out.println("list: "+list);


    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值