简介
HashMap 是基于哈希表的 Map 接口的非同步实现,允许null作为键或值,不保证顺序恒久不变,是无序的。
数据结构
Java中最基本的结构是数组和引用,HashMap就是通过这两个数据结构进行实现。实际上是一个“链表散列”的数据结构,是数组和链表的结合体(1.8后还加入了红黑树)
HashMap 中存储数据的是一个Node<K,V>[] table
数组,其中的内容可以是:
null
代表没有数据Node<K,V>
代表一个键值对(只有一个节点)Node<K,V>
代表一个链表(有多个节点,2~8,当长度大于8转换成红黑树树)TreeNode<K,V>
代表一个红黑树(有多个节点,8~)
put方法
get方法
构造函数
- HashMap() 构造一个初始容量16,负载因子为0.75的HashMap
- HashMap(int initialCapacity) 指定初始容量,负载因子为0.75
- HashMap(int initialCapacity, float loadFactor) 指定初始容量和负载因子
- 初始容量
initialCapacity
和负载因子loadFactor
两个参数共同决定了HashMap的最大容量:threshold = (int)(capacity * loadFactor);
- 当HashMap的元素数目超过
threshold
就需要进行resize()
,把容量变为原来的两倍,元素的位置也会进行重新分配 loadFactor
表示散列表空间使用程度,越大空间利用率越高,但是查询效率越低
Fail-Fast 机制
HashMap 不是线程安全的,利用了
modCount
参数来记录每次修改,所以在用Iterator
遍历过程中若发生并发修改会抛出ConcurrentModificationException
异常
遍历方式
map.entrySet()
遍历entrySet,同时遍历key和valuemap.keySet()
效率低,遍历key,需要get才能获取valuemap.forEach((k,v)-> System.out.println(k+" : "+v));
效率高,需要JDK1.8以上