HashMap.entrySet( )分析
我们在写代码的时候经常会用到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( )分析相关推荐
- Android面试题--HashMap原理分析
目录 一.序言 二 .HashMap原理分析 二.HashMap和Hashtable区别? 一.序言 作为Android程序员,出去找工作面试,HashMap应该是最常被问到的一种数据类型.那它是怎么 ...
- HashMap原理分析
HashMap 原理分析 文章目录 HashMap 原理分析 1.HashMap结构 2.散列哈希 3.容量table的计算 4.索引映射 5.put流程 6.扩容机制 HashMap 的原理在我们使 ...
- java .entryset_Java HashMap entrySet() 方法
entrySet() 方法返回映射中包含的映射的 Set 视图. 语法 entrySet() 方法的语法为: hashmap.entrySet() 注:hashmap 是 HashMap 类的一个对象 ...
- java entryset_Java HashMap entrySet()方法与示例
HashMap类entrySet()方法 (HashMap Class entrySet() method) entrySet() method is available in java.util p ...
- HashMap深度分析
HashMap是一个非常重要的集合,日常使用也非常的频繁,同时也是面试重点.本文并不打算讲解基础的使用api,而是深入HashMap的底层,讲解关于HashMap的重点知识.需要读者对散列表和Hash ...
- HashMap原理分析及性能优化
文章目录 一.HashMap是什么 二.HashMap继承类对比分析 三.HashMap源码相关单词含义 四.HashMap如何确定哈希桶数组索引位置 五. HashMap 的 put 方法分析 六. ...
- hashmap entrySet手记
之前看hashmap底层代码,只是主要在看他的代码结构,数据结构,以及相关get,put逻辑.今天突然想到,之前看源码好像都没有看到entryset.就心血来潮着重看了一下.结果,,,,,hashma ...
- Java基础之HashMap流程分析
首先我们得说明下HashMapJava1.7和Java1.8之间得区别: Java1.7:HashMap底层是数组+链表 Java1.8:HashMap底层是数组+链表+红黑树 HashMap.put ...
- HashMap底层分析_put添加元素
图片不够清晰?,点https://gitmind.cn/app/flowchart/f0c3178602查看高清图片,密码:7818 HashMap通过put()方法添加元素(List集合通过add( ...
最新文章
- 齐鲁师范学院计算机专业在那个校区,齐鲁师范学院有几个校区及校区地址 哪个校区最好...
- java遍历bean_javaweb利用javabean将数据库中内容遍历在页面输出
- 【MySQL】ubuntu16.04安装mysql,然后源码编译Qt5.12.4版本的libqsqlmysql.so
- vant 1.6.6 发布,轻量级移动端 Vue 组件库
- ntpdate[27350]: no server suitable for synchronization found
- mysql命令(command)
- 拓端tecdat|R语言多项式回归拟合非线性关系
- Acrel-3200远程预付费电能管理系统的功能介绍
- 数据保护/磁盘列阵RAID保护 IP段103.103.188.xxx
- ​微信公众号素材图片去哪找?
- Redis中的Lua脚本怎么玩
- 【UV打印机】RYPC打印软件教程(七)-PCS说明(上)
- gpu训练cnn人脸识别准确率_opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别
- Linux power supply framwork drvs
- 对Rapidly-exploring Random Trees(RRT)路径规划方法的理解
- 【读书笔记】c和指针
- 私有云大展拳脚 云计算发展趋势已明朗
- 项目管理中的边边角角 之三
- openwrt ipv6 防火墙设置
- java supplier t_在Java中如何使用lambda表达式中的Supplier T接口?