在 Java 1.8 中,HashMap 中添加元素使用的是 put(key, value)
方法,该方法的实现步骤如下:
- 计算 key 的哈希值,并将其与 HashMap 的容量减一后的值进行按位与操作,得到槽位索引,也就是该元素在哈希表中存放的位置。
- 如果该槽位上没有元素,直接将 key-value 对存放在该槽位上。
- 如果该槽位上已经存在元素,则遍历该槽位上的链表或红黑树,查找是否存在相同 key 的元素。
- 如果存在相同 key 的元素,则将该元素的 value 替换为新的值。
- 如果不存在相同 key 的元素,则将 key-value 对插入到链表或红黑树的末尾。
- 如果链表或红黑树的长度超过了阈值(默认为 8),则将链表转化为红黑树。
- 如果哈希表中的元素数量超过了阈值(默认为容量的 0.75 倍),则进行扩容,重新计算哈希值和槽位索引,将所有元素重新插入哈希表中。
需要注意的是,在多线程环境下,由于 HashMap 不是线程安全的,可能会发生并发修改导致的数据丢失或者死循环等问题。可以通过使用 ConcurrentHashMap
或者在单线程环境下使用 Collections.synchronizedMap
等方式来避免这些问题。