Administrator
发布于 2022-03-05 / 8 阅读
1
0

Collection集合里的迭代器

Collection集合的迭代器

迭代器适合所有集合。

常用的两个函数:

boolean hasNext();     //判断集合里还有无元素。

next();    //这个方法让迭代器前进一位,并且将指向的元素返回。

void remove();    //删除当前元素

一般这两个方法会一起使用,先hasNext()判断集合是否还有元素,然后next()拿到下一个元素。

public static void main(String[] args) {
        //创建一个集合对象
        Collection c =  new ArrayList();

        //添加数据
        c.add("你好");
        c.add("我叫阿冲");
        c.add("很高兴认识你");
        c.add("你叫什么名字?");
        c.add(123);
        c.add("abc");

//        创建集合对象
        Iterator it = c.iterator();

        //循环判断,并取出。
        while(it.hasNext()){
            Object obj = it.next();    //这里用Object类型接收,因为集合里存储的对象类型可能不一样
            System.out.println(obj);
        }

    }

迭代集合原理

该方法拿到一个迭代器,它负责遍历集合中的元素。

it.hasNext(); 这个方法返回true,表示集合里还有元素可以迭代,若返回false,则表示没有更多的元素可以迭代了。

it.next();表示拿到迭代器当前位置的下一个元素并返回。

把集合想象成一个数组,迭代器像一个指向集合里元素的箭头。起初,迭代器指向的位置是在第一个元素的前一位。it.next()每拿一个元素,迭代器就前进一位

Iterator it = c.iterator();
while(it.hasNext()){
            Object obj = it.next();    //这里用Object接收,因为集合里存储的对象类型可能不一样
            System.out.println(obj);
        }

迭代器remove方法

先说结论:如果集合的状态发生改变,对应迭代器必须重新获取。若集合的状态改变了,但是迭代器没有更新,此时还用旧的迭代器输出数据,就会发生异常。

例如以下代码:

​ 在拿到迭代器后,又往集合里添加一个新数据,此时下面的循环遍历就会报异常 ConcurrentModificationException

Collection c = new ArrayList();
c.add(123);
c.add(234);
c.add(234);

Iterator it = c.iterator();

c.add(1122);
while (it.hasNext()){
    Object o = it.next();
    System.out.println(o);
}

迭代器的原理:

​ 在执行语句Iterator it = c.iterator();的时候,相对于把 c 集合里的数据复制了一份出来保存到 it 里。在使用点带起的时候,系统会时刻检查 c集合 和 it迭代器的内容是否一致 。

​ 所以,往集合添加和删除元素的时候,需要及时更新迭代器;在迭代的过程中需要删除元素,必须使用迭代器的remove方法,而不是集合的remove方法。


评论