Iterator(迭代器)
循环遍历集合
//普通for循环
for (int i = 0; i < list.size(); i++) {}
//增强for循环
for (String str : list) {}
迭代器(Iterator)
Iterator 是 Java 中的 ⼀个接 ⼝,核 ⼼作 ⽤就是 ⽤来遍历容器的元素,当容器实现了 Iterator 接 ⼝后,可以通过调 ⽤ Iterator()⽅法获取 ⼀个 Iterator 对象。
因为容器的实现有多种,不同的容器遍历规则不 ⼀样,⽐如 ArrayList/LinkedList/HashSet/TreeSet 等,所以设计了 Iterator 接 ⼝,让容器本身去实 现这个接 ⼝,实现 ⾥ ⾯的 ⽅法,从 ⽽让开发 ⼈员不 ⽤关系容器的遍历机制,直接使 ⽤对应的 ⽅法即可。
核心方法
//⽤于判断iterator内是否有下个元素,如果有则返回true,没有则false
boolean hashNext()
//返回iterator的下⼀个元素,同时指针也会向后移动1位
Obejct next()
//删除指针的上⼀个元素(容易出问题,删除元素不建议使⽤容器⾃⼰的⽅法,非线程安全)。
//只有当next执⾏完后,才能调⽤remove函数。
//如要删除第⼀个元素,不能直接调⽤ remove(),要先next⼀下()否则调⽤remove⽅法是 会抛出异常。
//迭代器遍历元素时不能通过Collection接⼝中的remove⽅法删除元素,只能⽤Iterator的remove ⽅法删除元素; 原因:某个线程在 Collection 上进⾏迭代时,不允许另⼀个线程修改该 Collection
//迭代出的对象是引⽤的拷⻉,如果修改迭代中的元素,那么就是修改容器对象的本身。
void remove()
迭代器使用
//遍历List
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
//从容器中获取Iterator对象
Iterator<String> iterator = list.iterator();
//开始迭代容器内部元素
while (iterator.hasNext()) {
String str= iterator.next();
if("b".equals(str)){
//list.remove(); //ConcurrentModificationException并发修改异常
}
System.out.println(str);
}
//遍历Map
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("1", "a");
hashMap.put("2", "b");
hashMap.put("3", "c");
//获取entrySet
Set<Map.Entry<String, String>> entrySet = hashMap.entrySet();
//通过entrySet获取iterator迭代器对象
Iterator<Map.Entry<String, String>> iterator = entrySet.iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> next = iterator.next();
String key = next.getKey();
String value = next.getValue();
System.out.println("key=" + key + ", vlaue=" + value); //key=1, vlaue=a
}
迭代器 vs for 循环
- for 循环适合顺序访问,或者通过下标进 ⾏访问的
- 迭代器适合链式结构
- 最终看使 ⽤场景,性能会有轻微差别,但是可以忽略