HashMap源码分析
date
Oct 20, 2018
slug
HashMap源码分析
status
Published
tags
Java
summary
type
Post
继承及实现关系
源码导读
类内部的一些静态变量、局部变量、方法、内部类
- DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 Node数组默认初始化容量
- MAXIMUM_CAPACITY = 1 << 30; 最大容量
- DEFAULT_LOAD_FACTOR = 0.75f;
- TREEIFY_THRESHOLD = 8;
- resize() // 两倍扩展
- modCount 用于fail-fast机制
- Node<K,V>实现了Map接口里面的Entry接口
哈希碰撞Java8的优化
- 哈希桶数量增加到大于8改为红黑树,哈希桶数量减少到小于6改为链表
- 哈希桶再变为红黑树前采用尾插法
关于影响HashMap性能的初始化容量和负载因子:
0.75作为初始化的负载因子很好地平衡了时间和空间上的消耗,提高负载因子有利于空间的利用但是会提高查找时间。我们应该尽量减少rehash操作,如果初始化容量>(最大哈希桶容量*负载因子),那么rehash永远不会发生。
HashMap与HashTable的区别:
HashMap
非同步的,所以并非线程安全,key,value均允许null值
LinkedHashMap如何保持有序?
LinkedHashMap
继承Hashmap
,LinkedHashMap
的Map.entry
实现增加指向前后节点的引用