Java中关于Collection接口的迭代器iterator()方法
关于Collection中的迭代器iterator()方法:
1、Iterator iterator();是一个抽象方法,在集合子类中有重写。
2、这个方法是Collection接口继承了Iterable接口,继承过来的一个方法。
3、该方法返回的是一个Iterator类型接口。
4、每个子类集合中定义了一个私有内部类private class 类名 implements Iterator,已经实现了这个接口。
所以说每个子类可以使用重写的iterator()方法得到一个迭代器对象。
5、通常使用多态这样写:Iterator it = 实例集合对象.iterator();
迭代器接口指向迭代器对象。
子类拿到这个迭代器对象之后,就可以遍历自己集合中的元素。
6、Iterator接口有三个方法:
- boolean hasNext();
迭代过程中判断是否还有元素可迭代。 - Object next();
返回迭代的下一个元素 - default void remove();
在迭代器中删除集合的元素。注意:在迭代过程中不能使用集合自带的remove()方法,会迭代异常。
测试代码:
注意:以下测试代码,迭代方式通用于Collection的所有子类集合,但是,除了Map集合之外。
import java.util.*;
public class Test02 {
public static void main(String[] args) {
// 这里先测试List集合,有序可重复
Collection c = new ArrayList();
//Collection c = new LinkedList();
//Collection c = new Vector();
// 添加几个元素
c.add(1);
c.add(3.14);
c.add("hello");
c.add("hello");
c.add(true);
c.add(new Object());
System.out.println(c.size()); // 6
// 拿到集合的迭代器对象
Iterator it = c.iterator();
// 开始迭代遍历集合
while (it.hasNext()) {
Object obj = it.next();
System.out.println(obj); // 1 3.14 hello hello true java.lang.Object@7cd84586
}
// 再来试一下HashSet集合,无序不可重复
Collection c1 = new HashSet();
c1.add(1);
c1.add(3.14);
c1.add("hello");
c1.add("hello"); // 这个"hello"会存储失败,重复了
c1.add(true);
c1.add(new Object());
System.out.println(c1.size()); // 5
// 获取迭代器
Iterator it1 = c1.iterator();
while (it1.hasNext()) {
Object obj = it1.next();
System.out.println(obj); // 1 3.14 hello java.lang.Object@12edcd21 true
// 我们发现元素不可重复,且取出来的顺序也是乱的
// 注意:集合结构发生改变,迭代器必须重新获取。
// 所以说迭代过程中不能使用Collection的remove()方法,这样会改变迭代器的结构,下一循环迭代就会报异常
// 如果硬要在迭代中删除元素,是可用使用迭代器自己的remove()方法
}
}
}
迭代器遍历方式:
Iterator it = list.iterator();
while (it1.hasNext()) {
Object obj = it1.next();
System.out.println(obj);
}
结论:
集合结构发生改变,迭代器必须重新获取。
迭代过程中不能使用Collection的remove()方法,这样会改变迭代器的结构,下一循环迭代就会报异常。
如果硬要在迭代中删除元素,是可以使用迭代器自己的remove()方法。迭代器自己的删除方法会自动更新迭代器和集合结构。
还没有评论,来说两句吧...