HashMap是什么
- HashMap是一个链表散列(数组和链表),存储是键值对(key-value)映射,HashMap很快(非synchronized)。
- HashMap 是基于哈希表的Map接口的非同步实现。
- 实现提供所有可选的映射操作,并允许使用null值和null键(HashTable不能),键位置只能是一个null。
- 此类不保证映射的顺序,特别是不保证顺序永恒不变。
因JDK版本的变化
- JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理哈希冲突 (两个对象调用的hashCode方法计算的哈希码值一致导致计算的数组索引值相同),同一hash值的键值对会被放在同一个位桶里,当桶中元素较多时,通过key值查找的效率较低。
- JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(或红黑树的边界值,默认为8)并且当前数组的长度大于64时(小于64时对数组进行扩容),此时将链表转换为红黑树,具体查看 treeifBin 方法;这样大大减少了查找时间,提高效率。
链表散列的优势
数组、链表单独使用时的优劣
- 数组:存储区间连续、占用内存严重,故空间复杂度很大。但数组的二分查找时间复杂度小,为O(1)。特点:寻址容易,插入、删除困难。
- 链表:存储区间离散,占用内存宽松,故空间复杂度很小。但时间复杂度很大,为O(N)。特点:寻址困难,插入、删除容易。