Map中的forEach方法

本文详细解析了HashMap的内部实现,包括其继承自AbstractMap并实现Map、Cloneable、Serializable接口的特性,以及@since1.8引入的forEach方法的使用与限制。通过具体示例展示了HashMap的迭代方式,强调了它在并发场景下的局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请标明出处^_^
原文首发于: www.zhangruibin.com
本文出自于: RebornChang的博客

HashMap

HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
AbstractMap实现了Map接口。
Map接口里面有一个forEach方法,@since 1.8。

default void forEach(BiConsumer<? super K, ? super V> action) {
       Objects.requireNonNull(action);
       for (Map.Entry<K, V> entry : entrySet()) {
           K k;
           V v;
           try {
               k = entry.getKey();
               v = entry.getValue();
           } catch(IllegalStateException ise) {
               // this usually means the entry is no longer in the map.
               throw new ConcurrentModificationException(ise);
           }
           action.accept(k, v);
       }
   }

官方解释:
对此映射中的每个条目执行给定操作,直到所有条目已处理或操作引发异常。除非由实现类指定,操作将在入口集迭代的顺序(如果指定了迭代顺序)。
操作引发的异常将中继到调用方。

解读:
使用了try catch 抛出的异常为ConcurrentModificationException,标示在线程并发进行读写的时候会出现异常,即,不支持并发操作。

使用方法:

      Map<Object, Object> map = new HashMap<>();
      map.put("name", "RebornChang");
      map.put("gender", "男");
      map.put("phone", "18888888888");
      map.put(null, null);
      //1.Map的迭代
      // 通用的Map迭代方式
      System.out.println("==============Map的迭代======================");
      for (Map.Entry<Object, Object> entry : map.entrySet()) {
          System.out.println(entry.getKey() + ":" + entry.getValue());
      }
      System.out.println("====================================");
      // JDK8的迭代方式
      map.forEach((key, value) -> {
          System.out.println(key + ":" + value);
      });
      
      
      

结果:

        ==============Map的迭代======================
        null:null
        gender:男
        phone:18888888888
        name:RebornChang
        ====================================
        null:null
        gender:男
        phone:18888888888
        name:RebornChang
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值