版权属于:
Hello World
作品采用:
《
署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
》许可协议授权
迭代器适合所有集合。
常用的两个函数:
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方法。
评论 (0)