1.HashMap的概念
HashMap(基于哈希表的Map接口的实现)是Java集合框架中的一个分支,采用键值对(key,value)的格式存储数据。HashMap是一种散列表,它通过哈希函数将元素的键映射到数组中的一个位置,从而实现快速的插入、删除和查找操作。HashMap允许键和值为null,并且不保证它们的顺序。
2.HashMap的优点
- 查找,插入,删除速度快。在HashMap中,直接通过map.get(key)查找的的时候,首先会自动计算出key对应的哈希码,然后找到该哈希码对应的值,时间复杂度是O(1)。
- 易于拓展,灵活。HashMap中可以随意插入删除修改数据等操作,同时HashMap还支持动态扩容,当存储的键值对数量超过了容量的75%时,会自动触发扩容操作,以保证操作效率和内存占用的平衡。
- 键和值支持任意类型的数据,使得HashMap的使用更加灵活,适应大多场景。键和值还允许null的存储,这在有些情况下可以避免空指针异常。
3.HashMap的基本原理
HashMap内部有一个哈希表(table),当向HashMap存入(put)数据的时候,会先根据键计算出哈希码然后存储在table中,所以HashMap存储数据是无序的;
有一种特殊情况是当put一个新数据的时候,所计算出的哈希码对应table中已经存储了一对数据,也就是发生了哈希冲突(多个key经过哈希计算后的索引相同),HashMap会将这些数据用链表的方式存储在同一个位置,具体而言就是新的数据会被插入到同一位置的链表头部。Java 8引入了红黑树来优化链表的性能,当同一个位置上的链表长度超过阈值(默认为8)时,链表会被转换为红黑树。红黑树的插入、查找等操作时间复杂度较低,因此可以提高HashMap在处理大量键值对时的性能。
总结起来,HashMap使用链表法或红黑树法来存储具有相同哈希码的键值对,保证了效率和可靠性。不同的冲突解决方法可以根据具体情况进行选择,使HashMap能够在不同的数据规模和访问模式下都具有良好的性能。