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