我们在写代码的时候经常会用到HashMap这个方法的entrySet()方法,这个方法返回返回的是一个Set对象,很多人以为返回的是一个包含了Map里面所有键值对的一个集合对象,这个理解不准确,怎么说呢,通过这个Set对象,我们确实可以获取到Map里面存放的所有键值对,但是这个集合对象本身是不存放数据的,它只是助于我们遍历Map中的数据,类似于Iterator。下面我们来看看源码简要分析一下。

public Set<Map.Entry<K,V>> entrySet() {Set<Map.Entry<K,V>> es;return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
}

上面是entrySet()的源码,我么可以知道返回的其实是HashMap内部维护的一个引用entrySet,这个应用是EntrySet类型的。我们本能在HashMap的源码中找一下entrySet是何时填充数据的,搜遍代码我们会发现没有该逻辑,这个很奇怪啊,我们来看一下EntrySet的类定义,该类定义在HashMap的内部:

final class EntrySet extends AbstractSet<Map.Entry<K,V>> {public final int size()                 { return size; }public final void clear()               { HashMap.this.clear(); }public final Iterator<Map.Entry<K,V>> iterator() {return new EntryIterator();}public final boolean contains(Object o) {if (!(o instanceof Map.Entry))return false;Map.Entry<?,?> e = (Map.Entry<?,?>) o;Object key = e.getKey();Node<K,V> candidate = getNode(hash(key), key);return candidate != null && candidate.equals(e);}public final boolean remove(Object o) {if (o instanceof Map.Entry) {Map.Entry<?,?> e = (Map.Entry<?,?>) o;Object key = e.getKey();Object value = e.getValue();return removeNode(hash(key), key, value, true, true) != null;}return false;}public final Spliterator<Map.Entry<K,V>> spliterator() {return new EntrySpliterator<>(HashMap.this, 0, -1, 0, 0);}public final void forEach(Consumer<? super Map.Entry<K,V>> action) {Node<K,V>[] tab;if (action == null)throw new NullPointerException();if (size > 0 && (tab = table) != null) {int mc = modCount;// Android-changed: Detect changes to modCount early.for (int i = 0; (i < tab.length && modCount == mc); ++i) {for (Node<K,V> e = tab[i]; e != null; e = e.next)action.accept(e);}if (modCount != mc)throw new ConcurrentModificationException();}}
}

我们重点看一下EntrySet的forEach方法,可以看出这个方法可以读取到其所在的HashMap对象的存储的所有键值对,而我们经常使用entrySet方法就是用来进行foreach循环的。

好了,HashMap.entrySet( )本身并没有难度,但是有些朋友可能会对这个api理解并不准确,记住,该方法并不是返回一个存储数据的集合,它只是一个视图窗口。HashMap.ketSet()原理类似。

HashMap.entrySet( )分析相关推荐

  1. Android面试题--HashMap原理分析

    目录 一.序言 二 .HashMap原理分析 二.HashMap和Hashtable区别? 一.序言 作为Android程序员,出去找工作面试,HashMap应该是最常被问到的一种数据类型.那它是怎么 ...

  2. HashMap原理分析

    HashMap 原理分析 文章目录 HashMap 原理分析 1.HashMap结构 2.散列哈希 3.容量table的计算 4.索引映射 5.put流程 6.扩容机制 HashMap 的原理在我们使 ...

  3. java .entryset_Java HashMap entrySet() 方法

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

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

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

  5. HashMap深度分析

    HashMap是一个非常重要的集合,日常使用也非常的频繁,同时也是面试重点.本文并不打算讲解基础的使用api,而是深入HashMap的底层,讲解关于HashMap的重点知识.需要读者对散列表和Hash ...

  6. HashMap原理分析及性能优化

    文章目录 一.HashMap是什么 二.HashMap继承类对比分析 三.HashMap源码相关单词含义 四.HashMap如何确定哈希桶数组索引位置 五. HashMap 的 put 方法分析 六. ...

  7. hashmap entrySet手记

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

  8. Java基础之HashMap流程分析

    首先我们得说明下HashMapJava1.7和Java1.8之间得区别: Java1.7:HashMap底层是数组+链表 Java1.8:HashMap底层是数组+链表+红黑树 HashMap.put ...

  9. HashMap底层分析_put添加元素

    图片不够清晰?,点https://gitmind.cn/app/flowchart/f0c3178602查看高清图片,密码:7818 HashMap通过put()方法添加元素(List集合通过add( ...

最新文章

  1. 齐鲁师范学院计算机专业在那个校区,齐鲁师范学院有几个校区及校区地址 哪个校区最好...
  2. java遍历bean_javaweb利用javabean将数据库中内容遍历在页面输出
  3. 【MySQL】ubuntu16.04安装mysql,然后源码编译Qt5.12.4版本的libqsqlmysql.so
  4. vant 1.6.6 发布,轻量级移动端 Vue 组件库
  5. ntpdate[27350]: no server suitable for synchronization found
  6. mysql命令(command)
  7. 拓端tecdat|R语言多项式回归拟合非线性关系
  8. Acrel-3200远程预付费电能管理系统的功能介绍
  9. 数据保护/磁盘列阵RAID保护 IP段103.103.188.xxx
  10. ​微信公众号素材图片去哪找?
  11. Redis中的Lua脚本怎么玩
  12. 【UV打印机】RYPC打印软件教程(七)-PCS说明(上)
  13. gpu训练cnn人脸识别准确率_opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别
  14. Linux power supply framwork drvs
  15. 对Rapidly-exploring Random Trees(RRT)路径规划方法的理解
  16. 【读书笔记】c和指针
  17. 私有云大展拳脚 云计算发展趋势已明朗
  18. 项目管理中的边边角角 之三
  19. openwrt ipv6 防火墙设置
  20. java supplier t_在Java中如何使用lambda表达式中的Supplier T接口?

热门文章

  1. 公司考勤系统 功能和代码
  2. 优酷大剧全链路技术保障探索和实践
  3. C/C++小案例:汉语自动分词器
  4. 《看漫画学Python》1、2版分享,初阶+进阶一起学
  5. C# 终于会实时获得麦克风的响度了
  6. matplotlib学习笔记——入门版(超详细)
  7. Python画王者荣耀英雄能力雷达图
  8. Visio 图形大小如何随文字多少自动调整?
  9. 安卓手机怎么设置蓝牙耳机弹窗动画_AirPods耳机也能在安卓手机与windows系统里,有超赞的体验,只需这两款软件...
  10. keycloak SPI 开发讲解