链表和数组可以按照人们意愿排列元素的次序,但是,如果想要查看某个指定的元素,却又忘记了它的位置,就需要访问所有的元素,直到找到为止。如果集合中元素很多,将会消耗很多时间。有一种数据结构可以快速查找所需要查找的对象,这个就是哈希表(hash table).
HashMap是基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
本文按源码顺序拆 HashMap:先看数据结构是数组+链表的组合,再看构造函数里 initialCapacity 与 loadFactor 的默认值含义;接着是 put 操作的扩容流程、key 为 null 时的特殊存放位置,以及 hash 冲突的解决方式;get 操作的查找路径与 put 一致,区别在判定逻辑;最后是 fail-fast 机制怎么用 modCount 在迭代器里检测并发修改。Java 8 的红黑树改造不在本文范围。