JDK 1.8源码阅读 HashMap
一,前言
HashMap实现了Map的接口,而Map的类型是成对出现的。每个元素由键与值两部分组成,通过键可以找对所对应的值。Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。Map接口中的集合都有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量<K,V>的数据类型可以相同,也可以不同。
二,HashMap结构
我们知道在Java中最常用的两种结构是数组和模拟指针(引用),几乎所有的数据结构都可以利用这两种来组合实现,HashMap也是如此。实际上HashMap是一个“链表散列”,如下是它数据结构:
三,HashMap源码阅读
3.1 HashMap的继承关系
3.2 HashMap的构造方法
public HashMap(int initialCapacity, float loadFactor) {} // 初始容量,和加载因子 public HashMap(int initialCapacity) {} // 初始容量 public HashMap() {} // 空参构造 public HashMap(Map<? extends K, ? extends V> m) {} // 将Map对象进行构造
初始容量,加载因子。这两个参数是影响HashMap性能的重要参数,其中容量表示哈希表中桶的数量,初始容量是创建哈希表时的容量,加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度,它衡量的是一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。对于使用链表法的散列表来说,查找一个元素的平均时间是O(1+a),因此如果负载因子越大,对空间的利用更充分,然而后果是查找效率的降低;如果负载因子太小,那么散列表的数据将过于稀疏,对空间造成严重浪费。系统默认负载因子为0.75,一般情况下我们是无需修改的。
3.3 HashMap的常用方法
public int size() {} // 长度 public boolean isEmpty() {} // 是否为空 public V get(Object key) {} // 根据key获取值 public boolean containsKey(Object key) {} // 判断是否含某key public V put(K key, V value) {} // 添加Key Value public void putAll(Map<? extends K, ? extends V> m) {} // 添加多个 public V remove(Object key) {} // 删除 public void clear() {} // 清空 public boolean containsValue(Object value) {} // 判断是否有value public Set<K> keySet() {} // 将key转换成Set public Collection<V> values() {} // 将values转换成collection对象 // Overrides of JDK8 Map extension methods @Override
public V getOrDefault(Object key, V defaultValue) {} // 根据key获取,若不存在则设置该值 @Override
public V putIfAbsent(K key, V value) {} // 若key对于的值为空则设置该值,并返回 @Override
public boolean remove(Object key, Object value) {} //删除key value @Override
public boolean replace(K key, V oldValue, V newValue) {} // 指定值替换 @Override
public V replace(K key, V value) {} // 直接替换 @Override
public V computeIfAbsent(K key,Function<? super K, ? extends V> mappingFunction) {} public V computeIfPresent(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction) {} @Override
public V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction) {} @Override
public V merge(K key, V value,hash, key, value, first); @Override
public void forEach(BiConsumer<? super K, ? super V> action) {} // 提供迭代 @Override
public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {} @SuppressWarnings("unchecked")
@Override
public Object clone() {} // 复制 private void writeObject(java.io.ObjectOutputStream s)} private void readObject(java.io.ObjectInputStream s){}
四,总结
HashMap集合中的key不能重复,通过重写hashCode() 与 equals()方法来保证键的唯一。不能保证元素存与取的顺序完全一致
JDK 1.8源码阅读 HashMap的更多相关文章
- 【JDK1.8】JDK1.8集合源码阅读——HashMap
一.前言 笔者之前看过一篇关于jdk1.8的HashMap源码分析,作者对里面的解读很到位,将代码里关键的地方都说了一遍,值得推荐.笔者也会顺着他的顺序来阅读一遍,除了基础的方法外,添加了其他补充内容 ...
- JDK 1.8源码阅读 TreeMap
一,前言 TreeMap:基于红黑树实现的,TreeMap是有序的. 二,TreeMap结构 2.1 红黑树结构 红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性.同时红黑树更是一颗 ...
- JDK 1.8 源码阅读和理解
根据 一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础” 的指引,决定开始阅读下JDK源码. 本文将作为源码阅读总纲 一.精读部分 java.io java.lang java.util ...
- JDK 1.8源码阅读 HashSet
一,前言 类实现Set接口,由哈希表支持(实际上是一个 HashMap集合).HashSet集合不能保证的迭代顺序与元素存储顺序相同.HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依 ...
- JDK 1.8源码阅读 LinkList
一,前言 LinkedList是一个实现了List接口和Deque接口的双端链表.有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端. LinkedL ...
- JDK 1.8源码阅读 ArrayList
一,前言 ArrayList是Java开发中使用比较频繁的一个类,通过对源码的解读,可以了解ArrayList的内部结构以及实现方法,清楚它的优缺点,以便我们在编程时灵活运用. 二,ArrayList ...
- Java源码阅读HashMap
1类签名与注释 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cl ...
- JDK源码阅读--HashMap
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, ...
- 【JDK1.8】Java 8源码阅读汇总
一.前言 万丈高楼平地起,相信要想学好java,仅仅掌握基础的语法是远远不够的,从今天起,笔者将和园友们一起阅读jdk1.8的源码,并将阅读重点放在常见的诸如collection集合以及concu ...
随机推荐
- C#学习笔记(34)——委托传值(回忆版)
说明(2018-4-6 20:31:03): 1. 昨天晚上看三层,看完第一天的最后一节,会员的修改和增加,感觉欲仙欲死,果断关机睡觉. 2. 上午搞了半天哈利波特的原版书epub的下载,结果都没发现 ...
- SSH下authorized_keys, id_rsa, id_rsa.pub, known_hosts作用
一.known_hsots ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts.当下次访问相同计算机时,OpenSSH会核对公钥.如果公钥不同,O ...
- flask wigs 服务器
Nginx:Hey,WSGI,我刚收到了一个请求,我需要你作些准备,然后由Flask来处理这个请求. WSGI:OK,Nginx.我会设置好环境变量,然后将这个请求传递给Flask处理. Flask: ...
- 字符集之在UTF-8中,一个汉字为什么需要三个字节?
(一)在UTF-8中,一个汉字为什么需要三个字节? UNICODE是万能编码,包含了所有符号的编码,它规定了所有符号在计算机底层的二进制的表示顺序.有关Unicode为什么会出现就不叙述了,Unico ...
- php -v 与phpinfo显示版本不一样
问题描述: php -v显示版本7.0 phpinfo 显示版本 7.2 使用软件phpstudy 原因:环境变量中显示的是7.0,所以php -v显示的也是7.0 解决办法:修改环境变量,然后重启电 ...
- 在IE中启动火狐——自定义浏览器链接协议
有时候需求就是这么奇葩,特别是在这个浏览器混战收尾的节骨眼上,有的客户正在将全单位的浏览器统一到Chrome.有的正在统一到Firefox.还有的正在统一到360上.于是就有了如题的需求,客户正在将浏 ...
- IDEA-各模块间引用出现问题的解决方法
1 点击项目右上角的Project Structure 2 选择Modules->父项目->点击右上角的加号->添加需要依赖的模块
- windows上,任务管理器中,进程命令行太长怎么办
一.前言 在windows上,有时候需要查看进程命令行,但是有的进程的命令行太长了,很难看全 此时,可以使用下面的方法解决(红框改为自己要查看的进程即可): C:\Users\Gaoyu>wmi ...
- python生成组织架构图(网络拓扑图、graph.editor拓扑图编辑器)
Graph.Editor是一款基于HTML5技术的拓补图编辑器,采用jquery插件的形式,是Qunee图形组件的扩展项目,旨在提供可供扩展的拓扑图编辑工具, 拓扑图展示.编辑.导出.保存等功能,此外 ...
- rmq区间最值
时间复杂度O(NlogN)+O(Q) int a[N]; int dpmax[N][20],dpmin[N][20]; void first(int n) { mm(dpmax,0); mm(dpmi ...