Java集合框架遍历之迭代器(Iterator)

Java集合框架遍历之迭代器(Iterator)

什么是迭代器

  • 使⽤循环遍历集合
    • 普通for循环
    • 增强for循环
  • 什么是迭代器Iterator
    • Iterator是java中的⼀个接⼝,核⼼作⽤就是⽤来遍历容器的元素,当容器实现了Iterator接⼝后,可以通过调⽤Iterator()⽅法获取⼀个 Iterator对象
    • 为啥是调⽤容器⾥⾯的Iterator⽅法呢?
      • 因为容器的实现有多种,不同的容器遍历规则不⼀样,⽐如ArrayList/LinkedList/HashSet/TreeSet等,所以设计了Iterator接⼝,让容器本身去实现这个接⼝,实现⾥⾯的⽅法,从⽽让开发⼈员不⽤关系容器的遍历机制,直接使⽤对应的⽅法即可
    • 三个核⼼⽅法
      • boolean hashNext()
        • ⽤于判断iterator内是否有下个元素,如果有则返回true,没有则false
      • Obejct next()
        • 返回iterator的下⼀个元素,同时指针也会向后移动1位
      • void remove()
        • 删除指针的上⼀个元素(容易出问题,删除元素不建议使⽤容器⾃⼰的⽅法)
          在这里插入图片描述
          迭代器遍历集合
package domee.chapter9_1;

import java.util.*;

public class IteratorTest {
    
    
    public static void main(String[] args) {
    
    
        testSet();
        System.out.println("=================");
        testList();
    }

    
    public static void testList(){
    
    
        List<String> list = new LinkedList<>();
        list.add("111");
        list.add("222");
        list.add("333");
        list.add("444");
        list.add("111");
        list.add("B");
        list.add("C");
        list.add("A");
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
    
    
            String str = iterator.next();
            if (str.equals("111")){
    
    
                iterator.remove();
            }
            System.out.println(str);
        }

    }
    public static void testSet(){
    
    
        Set<String> set = new HashSet<>();
        set.add("111");
        set.add("222");
        set.add("333");
        set.add("444");
        set.add("111");
        set.add("B");
        set.add("C");
        set.add("A");
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
    
    
            String str = iterator.next();
            System.out.println(str);
        }
    }
}

详细讲解迭代器的进阶知识和注意事项

  • 迭代器是一种设计模式
  • 三个核心方法
  • boolean hashNext()
  • ⽤于判断iterator内是否有下个元素,如果有则返回true,没有则false
  • Obejct next()
  • 返回iterator的下⼀个元素,同时指针也会向后移动1位
  • void remove()
  • 删除指针的上⼀个元素
  • 只有当next执⾏完后,才能调⽤remove函数
  • 如要删除第⼀个元素,不能直接调⽤ remove(),要先next⼀下()否则调⽤remove⽅法是 会抛出异常的

迭代器遍历元素时不能通过Collection接⼝中的remove⽅法删除元素,只能⽤Iterator的remove⽅法删除元素; 原因 某个线程在 Collection 上进⾏迭代时,不允许另⼀个线程修改该 Collection

public static void testList(){
    
    
 List<String> list = new ArrayList<>();
 list.add("jack");
 list.add("tom");
 list.add("mary");
 list.add("tim");
 list.add("tony");
 list.add("eric");
 list.add("jack");
 Iterator<String> iterator = list.iterator();
 while (iterator.hasNext()){
    
    
 String str = iterator.next();
 if("jack".equals(str)){
    
    
 list.remove(str);//ConcurrentModificationException并发修改异常
 }
 System.out.println(str);
 }
 }
  • 迭代出的对象是引⽤的拷⻉,如果修改迭代中的元素,那么就是修改容器对象的本身
  • 和for循环对⽐
    • for循环适合顺序访问,或者通过下标进⾏访问的
    • 迭代器适合链式结构
    • 最终看使⽤场景,性能会有轻微差别,但是可以忽略

猜你喜欢

转载自blog.csdn.net/ruan_luqingnian/article/details/113570278