HashMap源码分析

date
Oct 20, 2018
slug
HashMap源码分析
status
Published
tags
Java
summary
type
Post

继承及实现关系

notion image

源码导读

类内部的一些静态变量、局部变量、方法、内部类

  • 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性能的初始化容量和负载因子:

notion image
0.75作为初始化的负载因子很好地平衡了时间和空间上的消耗,提高负载因子有利于空间的利用但是会提高查找时间。我们应该尽量减少rehash操作,如果初始化容量>(最大哈希桶容量*负载因子),那么rehash永远不会发生。

HashMap与HashTable的区别:

  • HashMap非同步的,所以并非线程安全,key,value均允许null值
notion image

LinkedHashMap如何保持有序?

LinkedHashMap继承HashmapLinkedHashMapMap.entry实现增加指向前后节点的引用
notion image
 

© Ryan Tang 2021 - 2025