首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java-HashMap-forEach源码分析

Java-HashMap-forEach源码分析

作者头像
韩旭051
发布于 2021-04-14 06:58:36
发布于 2021-04-14 06:58:36
31900
代码可运行
举报
文章被收录于专栏:刷题笔记刷题笔记
运行总次数:0
代码可运行

Java HashMap EntrySet 内部类 的 forEach 方法 分析

forEach()

该方法签名为void forEach(BiConsumer<? super K,? super V> action), 作用是对Map中的每个映射执行action指定的操作, 其中BiConsumer是一个函数接口, 里面有一个待实现方法void accept(T t, U u)。 BinConsumer接口名字和accept()方法名字都不重要,请不要记忆他们。

源码

HashMap 的 forEach

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//    作用是对Map中的每个映射执行action指定的操作,
//    其中BiConsumer是一个函数接口,
//    里面有一个待实现方法void accept(T t, U u)
    @Override
    public void forEach(BiConsumer<? super K, ? super V> action) {
//        哈希表底层 tab
        Node<K,V>[] tab;
//        空的 action 过滤 抛异常
        if (action == null)
            throw new NullPointerException();
//        过滤 tab 的合法性 顺便 赋个值 tab = table
        if (size > 0 && (tab = table) != null) {
//            结构调整的次数哦 modCount
            int mc = modCount;
//            遍历 tab
            for (int i = 0; i < tab.length; ++i) {
//                遍历 哈希表上的 链表或 红黑树
                for (Node<K,V> e = tab[i]; e != null; e = e.next)
                    action.accept(e.key, e.value);
            }
//            遍历过程中 hashMao 结构发生了调整
            if (modCount != mc)
                throw new ConcurrentModificationException();
        }
    }

EntrySet 的 forEach

其实是我写错了,本来应该 分析 HashMap 的结果源码找错了位置强行 分析了 这里的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//         forEach 遍历HashMap的元素
//        final 代表不可修改 在这个方法也没有返回值
//        传进来的参数有 Consumer<? super Map.Entry<K,V>>  是一个 action
        public final void forEach(Consumer<? super Map.Entry<K,V>> action) {
//            tab就是存储的底层哈希表
            Node<K,V>[] tab;
//            action 如果是空的就没法遍历了
            if (action == null)
                throw new NullPointerException();
//            判断 这个 tab 是 合法的 size 大于零 tab 赋值 table 的引用 判断不为空
//            生产环境这样写代码会被打死
            if (size > 0 && (tab = table) != null) {
//                mc 是 记录 调整的次数
//                The number of times this HashMap has been structurally modified
                int mc = modCount;
//                遍历整个 hash 表
                for (int i = 0; i < tab.length; ++i) {
//                    for 循环 遍历 tab[i]
//                    从生产者 方 接收数据
                    for (Node<K,V> e = tab[i]; e != null; e = e.next)
                        action.accept(e);
                }
//                发生了 哈希表 结构的调整
                if (modCount != mc)
                    throw new ConcurrentModificationException();
            }
        }
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
HashMap源码学习
HashMap如何比较俩个key是否一样的?就是通过hashcode方法和equals方法比较的
晓果冻
2022/09/08
2400
HashMap源码学习
jdk-HashMap(1.8)源码学习
hashMap是我们日常用得最多的一种并发包其中之一了,hashMap是线程不安全的,不安全主要体现在高并发的场景下,
逍遥壮士
2023/02/28
3630
jdk-HashMap(1.8)源码学习
【Java入门提高篇】Day24 Java容器类详解(七)HashMap源码分析(下)
前两篇对HashMap这家伙的主要方法,主要算法做了一个详细的介绍,本篇主要介绍HashMap中默默无闻地工作着的集合们,包括KeySet,values,EntrySet,以及对应的迭代器:HashIterator,KeyIterator,ValueIterator,EntryIterator和 fast-fail 机制。会介绍三个集合的作用以及它们中隐藏的惊人秘密。
弗兰克的猫
2018/06/22
5136
【Java入门提高篇】Day24 Java容器类详解(七)HashMap源码分析(下)
HashMap源码解析(JDK1.8)
1 package java.util; 2 3 import sun.misc.SharedSecrets; 4 5 import java.io.IOException; 6 import java.io.InvalidObjectException; 7 import java.io.Serializable; 8 import java.lang.reflect.ParameterizedType; 9 import java.lang.re
武培轩
2018/04/18
1.1K0
深入解析HashMap 再也不怕面试问了
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
终码一生
2022/04/14
2400
深入解析HashMap 再也不怕面试问了
HashMap 源码解析(JDK1.8)
HashMap是由数组加链表的结合体。如下图: Paste_Image.png 图中可以看出HashMap底层就是一个数组结构,每个数组中又存储着链表(链表的引用) JDK1.6实现hashmap的方
java404
2018/05/18
7180
为什么阿里不推荐使用 keySet() 遍历HashMap?
HashMap相信所有学Java的都一定不会感到陌生,作为一个非常重用且非常实用的Java提供的容器,它在我们的代码里面随处可见。因此遍历操作也是我们经常会使用到的。HashMap的遍历方式现如今有非常多种:
搜云库技术团队
2023/11/17
5260
为什么阿里不推荐使用 keySet() 遍历HashMap?
HashMap原理。图文并茂式解读。这些注意点你一定还不了解
本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap。HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现。HashMap 允许 null 键和 null 值,在计算哈键的哈希值时,null 键哈希值为 0。HashMap 并不保证键值对的顺序,这意味着在进行某些操作后,键值对的顺序可能会发生变化。另外,需要注意的是,HashMap 是非线程安全类,在多线程环境下可能会存在问题。
啵啵肠
2023/11/28
1830
LinkedHashMap实现LRU - 附重点源码解析
最近接触LRU(Least Recently Used),即最近最少使用,也称淘汰算法,在JDK中LinkedHashMap有相关实现,下面针对LRU及LinkedHashMap的LRU实现进行详细讲解
夹胡碰
2020/12/16
2.9K0
LinkedHashMap实现LRU - 附重点源码解析
Java集合深度解析之Hashtable
Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 Hashtab
互扯程序
2018/03/26
1.1K0
Java集合深度解析之Hashtable
LinkedHashMap源码分析
我们都知道HashMap是无序的Map,TreeMap是有序的Map。而LinkedHashMap继承于HashMap,也是一个有序的Map,这似乎违背了Hash的理论。(注:TreeMap和LinkedHashMap的有序性是不一样的,TreeMap的根据Key的大小来排序的,而LinkedHashMap是根据put的先后顺序来排序的)
算法之名
2020/05/26
3820
阿里不让用keySet() 遍历HashMap?真逆天!!
HashMap相信所有学Java的都一定不会感到陌生,作为一个非常重用且非常实用的Java提供的容器,它在我们的代码里面随处可见。因此遍历操作也是我们经常会使用到的。HashMap的遍历方式现如今有非常多种:
搜云库技术团队
2024/04/25
1680
阿里不让用keySet() 遍历HashMap?真逆天!!
HashMap学习
samRsa
2025/02/24
810
HashMap的这个小“坑”;老司机也容易翻车
昨天一位粉丝朋友和我聊天,说遇到了一个莫名奇妙的问题,让我帮着分析一下;经过他的一轮描述,发现是一个HashMap元素顺序小'坑';但是一不留神,老司机也容易在这里翻车。
一行Java
2022/04/07
2810
HashMap的这个小“坑”;老司机也容易翻车
聊聊java中的哪些Map:(一)HashMap(1.8)源码分析
无论是大厂还是不知名的小公司,HashMap都是一个绕不开的话题。基本上,如果通过HashMap能聊半小时以上,基本offer就没什么大碍了。现在我们也看看HashMap的源码,看看为什么这么被面试官待见。
冬天里的懒猫
2020/08/24
4480
聊聊java中的哪些Map:(一)HashMap(1.8)源码分析
Hashtable源码解析(JDK1.8)
1 package java.util; 2 3 import java.io.*; 4 import java.util.concurrent.ThreadLocalRandom; 5 import java.util.function.BiConsumer; 6 import java.util.function.Function; 7 import java.util.function.BiFunction; 8 9 import sun.mi
武培轩
2018/04/18
7210
java进阶|HashTable源码分析和理解
键值对集合Map,HashTable都是我们常用的,但是随着多线程环境以及代码的普及,ConcurrentHashMap这样的并发集合也常用了起来,今天我们先来分析一下HashTable的源码。
码农王同学
2020/04/09
5500
java进阶|HashTable源码分析和理解
Java集合之WeakHashMap[通俗易懂]
WeakHashMap继承于AbstractMap,同时实现了Map接口。
全栈程序员站长
2022/09/04
7050
Java集合之WeakHashMap[通俗易懂]
jdk源码-HashMap
AbstractMap是Map接口的抽象实现类,通过抽象方法keySet()实现了get(key),remove(key),containsKey(key),containsValue(value)的基本算法,遍历加equals。
逝兮诚
2019/10/30
3850
java集合介绍_java代码分析框架
HashMap 是 Map 接口下一个线程不安全的,基于哈希表的实现类。由于他解决哈希冲突的方式是分离链表法,也就是拉链法,因此他的数据结构是数组+链表,在 JDK8 以后,当哈希冲突严重时,HashMap 的链表会在一定条件下转为红黑树以优化查询性能,因此在 JDK8 以后,他的数据结构是数组+链表+红黑树。
全栈程序员站长
2022/09/23
8480
java集合介绍_java代码分析框架
相关推荐
HashMap源码学习
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
加入讨论
的问答专区 >
高级后端开发工程师擅长3个领域
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档