Java迭代器

83 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情

01.集合_集合框架体系结构介绍

1).Collection(接口):单列集合
    |--List(接口):特点:1).元素有序的;2).可以存储重复元素(都是由集合内部的数据结构决定的)
        |--ArrayList(子类):数组实现--线程不安全的,效率高
        |--Vector(子类):数组实现--线程安全的,效率低
        |--LinkedList(子类):链表实现

    |--Set(接口):特点:1).无序的;2).不能存储重复元素;(都是由集合内部的数据结构决定的)
        |--HashSet(子类):哈希表实现
        |--LinkedHashSet(子类):链表、哈希表实现
2).Map(接口) : 双列集合
    |--HashMap(子类):
    |--LinkedHashMap(子类):

02.集合_Collection接口的常用方法:

添加

1).boolean add(Object e) : 向集合中添加一个元素;如果元素存储成功返回true(对于ArrayList,永远返回true);如果存储失败 返回false,例如:向HashSet中添加一个重复元素时,会返回false。

删除

2).void clear():移除此集合中的所有元素;

查询

3).boolean contains(Object o):如果当前集合中包含对象o,返回true,否则返回false;

删除

4).boolean remove(Object o) : 从集合中移除对象o,成功返回true,否则返回false

查询(获取)

5).int size():获取集合大小

查询(获取)

6).Object[] toArray():将集合内的所有元素存储到一个Object[]中,并返回。将集合转换为数组;

7).Iterator iterator():获取一个迭代器,用于遍历元素的。

03.集合_迭代器的概念_基本使用

1).迭代器:用于遍历元素的对象;

2).Collection-->iterator()

3).例如:

    Collection<String> strList = new ArrayList<>();
    strList.add("孙悟空");
    strList.add("猪八戒");
    strList.add("白骨精");
    strList.add("牛魔王");

    //获取迭代器
    Iterator<String> it = strList.iterator();
    while(it.hasNext()){
        System.out.println(it.next());
    }

04.集合_迭代器

常见的问题:

1).一次判断,多次next():

    ....
    Iterator<String> it = strList.iterator();
    while(it.hasNext()){
        String s = it.next();//没有被用到,被扔掉了
        System.out.println(it.next());//取出下一个元素
    }

2).此迭代器是"单向"的,只能使用一次;

    ...
    Iterator<String> it = strList.iterator();
    while(it.hasNext()){
        System.out.println(it.next());
    }
    while(it.hasNext()){//此循环不会被执行
        System.out.println(it.next());
    }
    it = strList.iterator();//可以再次获取一个迭代器对象
    while(it.hasNext()){//OK的
        System.out.println(it.next());
    }

05.集合_练习_迭代器操作自定义对象

    Collection<Student> stuList = new ArrayList<>();
    stuList.add(new Student("章子怡",20,'女'));
    stuList.add(new Student("汪峰",22,'男'));
    stuList.add(new Student("撒贝宁",23,'男'));

    Student stu = new Student("章子怡",20,'女');
    System.out.println("判断一个对象是否存在:" + stuList.contains(stu));//调用参数对象equals()方法跟集合内部的每个元素依次比较。

    //获取迭代器
    Iterator<Student> stuIt = stuList.iterator();
    while(stuIt.hasNext()){
        stu = stuIt.next();
        System.out.println(stu);
    }

06.集合_迭代器的并发修改异常

1).例子:

        Collection<String> strList = new ArrayList<>();
        strList.add("孙悟空");
        strList.add("猪八戒");
        strList.add("白骨精");
        strList.add("牛魔王");

        //获取迭代器
        Iterator<String> it = strList.iterator();
        while(it.hasNext()){
            String s = it.next();
            if("牛魔王".equals(s)){
                strList.remove(s);//会导致运行时抛出"并发修改异常":ConcurrentModificationException   
            }
            System.out.println(s);
        }

2).并发修改异常产生的原因:当通过"迭代器"遍历时,通过"集合对象"去修改元素的数量,会导致"迭代器"抛出并发修改异常。

3).解决方式:

通过迭代器遍历,就通过迭代器修改

        ...
        while(it.hasNext()){
            String s = it.next();
            if("牛魔王".equals(s)){
            //    strList.remove(s);//会导致运行时抛出"并发修改异常":ConcurrentModificationException   
                it.remove();//这就没问题了
            }
            System.out.println(s);
        }

4).并不是每个元素都抛异常,比如:删除"白骨精"时就不会抛异常,原因由于next()方法的中的判断机制导致,这是一种"数值"上的巧合。并不意味着这种操作是正确的。