目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

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 接 ⼝,让容器本身去实 现这个接 ⼝,实现 ⾥ ⾯的 ⽅法,从 ⽽让开发 ⼈员不 ⽤关系容器的遍历机制,直接使 ⽤对应的 ⽅法即可。

核心方法
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 循环适合顺序访问,或者通过下标进 ⾏访问的
  • 迭代器适合链式结构
  • 最终看使 ⽤场景,性能会有轻微差别,但是可以忽略

作者:Soulboy