之前看hashmap底层代码,只是主要在看他的代码结构,数据结构,以及相关get,put逻辑。今天突然想到,之前看源码好像都没有看到entryset。就心血来潮着重看了一下。结果,,,,,hashmap中真没有对entryset的相关操作。

hashmap构造方法:
可以看到hashmap构造方法只是初始化了一个默认装载因子。
put方法:

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {Node<K,V>[] tab; Node<K,V> p; int n, i;if ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length;if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null);else {Node<K,V> e; K k;if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))e = p;else if (p instanceof TreeNode)e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);else {for (int binCount = 0; ; ++binCount) {if ((e = p.next) == null) {p.next = newNode(hash, key, value, null);if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1sttreeifyBin(tab, hash);break;}if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))break;p = e;}}if (e != null) { // existing mapping for keyV oldValue = e.value;if (!onlyIfAbsent || oldValue == null)e.value = value;afterNodeAccess(e);return oldValue;}}++modCount;if (++size > threshold)resize();afterNodeInsertion(evict);return null;}

其中并没有看到对entryset的操作。包括resize扩容,newNode创建新节点。
那么,为了搞清楚hashmap中的entryset何时初始化,何时添加元素,我开始了debug:
测试方法:

public static void main(String[] args) {//map entryset 何时初始化HashMap<String,String> map = new HashMap<>();String key01 = "key";map.put(key01,"key01");String v01 = map.get(key01);Set<Map.Entry<String, String>> entries = map.entrySet();map.toString();System.out.println(v01);}

结果就看图片把:
首先进入put方法:

可以看到,因为是第一次添加元素,所以map的table此时为空,需要进行首次resize。此时的entryset还是null;

但是当代码进入到resize方法中第一行的时候,此时的entryset就莫名其妙的被初始化了,可以看到长度为0;

然后一直执行到判断是否需要扩容的时候,此时entryset仍为空,长度仍为0。但是接下来就又莫名其妙了;

因为是首次添加元素,所以在put完毕之后,并没有执行resize方法。其实在执行完++size>threshold的判断后,就直接跳到了after方法。但是诡异的是,此时的entryset长度居然变为了1!!!

于时我去网上找资料。发现debug模式会隐式的调用toString方法,而该方法就会初始化entry
算是勉强解释了entry初始化的原因。但是还是没能解释何时添加的元素。

等我再研究研究。

hashmap entrySet手记相关推荐

  1. HashMap.entrySet( )分析

    我们在写代码的时候经常会用到HashMap这个方法的entrySet()方法,这个方法返回返回的是一个Set对象,很多人以为返回的是一个包含了Map里面所有键值对的一个集合对象,这个理解不准确,怎么说 ...

  2. java .entryset_Java HashMap entrySet() 方法

    entrySet() 方法返回映射中包含的映射的 Set 视图. 语法 entrySet() 方法的语法为: hashmap.entrySet() 注:hashmap 是 HashMap 类的一个对象 ...

  3. java entryset_Java HashMap entrySet()方法与示例

    HashMap类entrySet()方法 (HashMap Class entrySet() method) entrySet() method is available in java.util p ...

  4. HashMap遍历的两种方式,推荐使用entrySet()

    转自:HashMap遍历的两种方式,推荐使用entrySet() 第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterat ...

  5. 高效编程之HashMap的entryset和keyset比较

    最近看了一点spring的源码,甚是苦涩:对spring稍微有了点整体的认识,但对很多细节的地方还是懵逼啊...太多不懂了的,只能慢慢去读,先把简单的不懂的解决: 比如beanfactory通过扫描器 ...

  6. HashMap keySet与entrySet遍历分析

    keySet(): 返回的是只存放key值的Set集合,使用迭代器方式遍历该Set集合,在迭代器中再使用get方法获取每一个键对应的值 代码案例: keySet遍历代码 /*** 通过keySet遍历 ...

  7. HashMap 和 Hashtable 的 6 个区别,最后一个没几个人知道!

    HashMap 和 Hashtable 是 Java 开发程序员必须要掌握的,也是在各种 Java 面试场合中必须会问到的. 但你对这两者的区别了解有多少呢? 现在,栈长我给大家总结一下,或许有你不明 ...

  8. HashMap 详解七

    使用 Iterator 遍历 通过 HashMap.entrySet().iterator() 方法获取迭代器, 使用 next 方法对 HashMap 进行遍历. HashMap<String ...

  9. HashMap原理和使用

    2019独角兽企业重金招聘Python工程师标准>>> 1.    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用 ...

最新文章

  1. 虽然这些代码很少,就几行,但却很牛逼!
  2. 感知器调参之梯度下降法
  3. 下一代数据网加速器成立,致力于建设智能时代的大数据基础设施
  4. nginx实现负载均衡
  5. shell变量加单引号sql_关于shell:在Bash中的命令中扩展变量的单引号
  6. 批量关闭电脑有害端口方法
  7. 官网快速搭建spring boot 项目
  8. charles使用说明(基于mac)
  9. python集合操作班级干部竞选演讲稿_精选竞选班干部的演讲稿集合7篇
  10. linux运维实战练习--用户和组管理各命令的使用
  11. SpringCloud 阶段总结
  12. mysql的sql优化工具下载_MySQL SQL查询优化工具EverSQL
  13. python调用百度查询关键字_Python模拟搜索百度关键字
  14. st_aggrid pip下载失败问题
  15. 宝塔linux面板mysql数据库误删恢复过程
  16. SEO原创助手-SEO免费原创助手工具自动分析网站排名
  17. 【Python】详解 collections.Counter
  18. 网络文件常常提到类似./run.sh的数据,这个命令的意义是什么?
  19. 移动硬盘遇到无法访问,参数错误的处理方法
  20. 在outlook客户端设置阿里企业邮箱

热门文章

  1. 新世界!打开Selenium和PhantomJs的大门!--爬虫福音
  2. 009 Django 应用和分布式路由
  3. Java实现 LeetCode 699 掉落的方块(线段树?)
  4. 家里电脑dnf无线连接服务器,win7系统dnf正在连接服务器的解决方法
  5. matplotlib--------简单的折线图之x轴y轴刻度
  6. OneNote丢失笔记分区后找回
  7. JavaScript的常用内置对象
  8. Oracle开启内存自动管理
  9. 好嗨游戏:夏季赛常规赛结束,一文看懂S赛名额形势||附赛程
  10. 3.13 使用画笔工具绘制艺术线条 [Illustrator CC教程]