一.描述
HashMap是常用的Java集合之一,是基于哈希表的Map接口的实现。设计目标是尽量实现哈希表O(1)级别的增删改查效果,与HashTable主要区别为**==不支持同步和允许null作为key和value==**。
二.底层实现
-
JDK1.8之前:
1、实现:
采用 ==数组+链表== 实现,形成一个数组带着多个桶的结构,每个数组元素就是一个桶,而数组索引就是每个桶中链表的表头,每一个Map元素的数据结构是一个 ==Entry==。
- 数组存储区间连续,占用内存较多,寻址容易,插入和删除困难。
- 链表存储区间离散,占用内存较少,寻址困难,插入和删除容易。
2、遗留问题:
在某些极端情况下,会导致大量元素都存放在同一个桶(数组索引是链表的表头)的链表中,此时的HashMap 就相当于一个单链表,假设链表中的元素个数为n个,则其==操作时间复杂度就变成了O(n)==,完全失去了哈希表的优势。
-
JDK1.8及以后:
1、实现:
采用 ==数组+链表+红黑树== 实现。每个Map元素的数据结构是 ==Node(链表)