HashMap 原理及复杂度
HashMap 是基于哈希表的 Map 接口的非同步实现。它通过 put (key, value) 方法来存储键值对。
在原理方面,它内部维护了一个数组(桶),当调用 put 方法时,会先根据 key 的 hashCode () 方法计算出哈希值,然后通过哈希函数将哈希值转换为数组的索引,从而确定键值对存储在数组中的位置。如果该位置没有元素,就直接插入;如果已经有元素了(发生了哈希冲突),则会采用链表(在 Java 8 中,当链表长度大于等于 8 且数组长度大于等于 64 时会转换为红黑树)的方式将新元素插入到已有元素后面。
在时间复杂度方面,理想情况下(没有哈希冲突),put 和 get 操作的时间复杂度可以达到 O (1)。这是因为通过计算哈希值可以直接定位到数组中的位置。但在最坏情况下,例如所有元素的哈希值都相同,那么 put 和 get 操作就会退化为链表的操作,时间复杂度为 O (n)。不过在实际应用中,只要哈希函数设计合理,哈希冲突的概率会比较低,所以 HashMap 的性能还是比较高效的。
在空间复杂度方面,主要取决于存储的键值对数量。它会占用一定的数组空间以及链表或者红黑树节点的空