Java 1.7版本:
- 根据key的hashCode计算出桶位的索引。
- 如果该索引位置没有元素,直接将键值对存储到该位置。
- 如果该位置有元素,可能是一个链表或红黑树的头节点,首先遍历链表或树来判断键值对是否已经存在。
- 如果key已经存在,则更新对应的值。
- 如果key不存在,则将键值对追加到链表或树的末尾。
- 如果链表长度达到阈值(默认为8),或者链表长度达到8且桶的数量大于64,则将链表转换为红黑树结构,提高查找效率。
- 如果发生哈希冲突,即不同的key计算出的索引一样,但是它们的hashCode不同,HashMap会找到下一个空闲的位置存储。
Java 1.8版本:
- 根据key的hashCode计算出桶位的索引。
- 如果该索引位置没有元素,直接将键值对存储到该位置。
- 如果该位置有元素,可能是一个链表或红黑树的头节点,首先遍历链表或树来判断键值对是否已经存在。
- 如果key已经存在,则更新对应的值。
- 如果key不存在,则将键值对追加到链表或树的末尾。
- 如果链表长度达到阈值(默认为8),或者链表长度达到8且桶的数量大于64,则将链表转换为红黑树结构,提高查找效率。
- 如果红黑树节点个数小于6个,且发生哈希冲突时,在树上进行节点分裂。
- 如果发生哈希冲突,即不同的key计算出的索引一样,但是它们的hashCode不同,HashMap会找到下一个空闲的位置存储。
Java 1.8版本在处理哈希冲突和链表长度达到阈值时进行了一些优化,通过引入红黑树提高了查找效率,并在红黑树节点较少时进行节点分裂,避免在多线程环境下导致死锁。这些优化使得在一些场景下,Java 1.8版本的HashMap性能更好。