专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

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

什么是迭代器

  • 使⽤循环遍历集合
    • 普通for循环
    • 增强for循环
  • 什么是迭代器Iterator
    • Iterator是java中的⼀个接⼝,核⼼作⽤就是⽤来遍历容器的元素,当容器实现了Iterator接⼝后,可以通过调⽤Iterator()⽅法获取⼀个 Iterator对象
    • 为啥是调⽤容器⾥⾯的Iterator⽅法呢?
      • 因为容器的实现有多种,不同的容器遍历规则不⼀样,⽐如ArrayList/LinkedList/HashSet/TreeSet等,所以设计了Iterator接⼝,让容器本身去实现这个接⼝,实现⾥⾯的⽅法,从⽽让开发⼈员不⽤关系容器的遍历机制,直接使⽤对应的⽅法即可。

迭代器的三个核心方法

81_1.png81_2.png

public class IteratorTest {

    public static void main(String[] args) {
        test();
    }
//使用的set集合自动去重,list集合同理,可重复
    public static void test(){
        Set<String> set=new HashSet<>();
        set.add("jjbq");
        set.add("junko");
        set.add("jjbq");
        System.out.println(set);
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

81_3.png


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

  • 迭代器属于一种设计模式
  • 三个核心方法的详细操作
/*
boolean hashNext()
⽤于判断iterator内是否有下个元素,如果有则返回true,没有则false

Obejct next()
返回iterator的下⼀个元素,同时指针也会向后移动1位

void remove()
删除指针的上⼀个元素
只有当next执⾏完后,才能调⽤remove函数
如要删除第⼀个元素,不能直接调⽤ remove(),要先next⼀下()否则调⽤remove⽅法是会抛出异常的*/

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

迭代器本身在服务集合,如果在迭代循环过程中remove的时候使用集合的方法,就像是搬运的东西被偷走了,所以会出问题。在此中途可以break一下,就不会报错。

    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并发修改异常
                break;//及时终止循环,就不会有异常
            }
            System.out.println(str);
        }
    }

  • 迭代出的对象是引⽤的拷⻉,如果修改迭代中的元素,那么就是修改容器对象的本身
    • 和for循环对⽐
      • for循环适合顺序访问,或者通过下标进⾏访问的
      • 迭代器适合链式结构

最终看使⽤场景,性能会有轻微差别,但是可以忽略

补充:Map集合迭代器的使用用例

public static void testMap(){
        Map<String,String> map=new HashMap<>();
        map.put("jjbq","23");
        map.put("junko","24");
        System.out.println("------循环key获取value打印------");
        for (String s : map.keySet()) {
            System.out.println(map.get(s));
        }
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        System.out.println("------entryset遍历输出------");
        System.out.println(entrySet);
        for (Map.Entry<String, String> stringStringEntry : entrySet) {
            System.out.println(stringStringEntry.getKey()+":"+stringStringEntry.getValue());
        }
        System.out.println("------迭代器打印------");
        Iterator<Map.Entry<String, String>> iterator = entrySet.iterator();
        while (iterator.hasNext()){
            Map.Entry<String, String> entry = iterator.next();
            String str = entry.getKey() + ":" + entry.getValue();
            System.out.println(str);
        }

81_4.png

文章永久链接:https://tech.souyunku.com/27238

未经允许不得转载:搜云库技术团队 » Java集合框架遍历之迭代器(Iterator)

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们