在使用 HashMap 的 get 和 put 方法时,经过以下步骤:
- put 方法: a. 首先,根据传入的键(key)计算其 hash 值; b. 使用 hash 值通过哈希函数找到要插入或替换的数组位置,即索引(index); c. 如果该位置上没有元素,直接将键值对存储到该位置; d. 如果该位置上已经存在元素,则根据键的 equals 方法判断是否相等,如果键相等则替换该键对应的值,如果键不相等则发生冲突,需要解决冲突; e. 解决冲突的方法是使用链表或红黑树等数据结构在该位置上存储多个键值对,根据键的 equals 方法找到对应的键值对进行替换; f. 如果链表的长度达到一定的阈值(8),则将链表转换为红黑树,以提高查找效率; g. 如果哈希表的容量不足,即达到了负载因子(load factor)的上限(默认是 0.75),则触发扩容操作,将原有的键值对重新分配到新的哈希表中。
- get 方法: a. 首先,根据传入的键(key)计算其 hash 值; b. 使用 hash 值通过哈希函数找到对应的数组位置,即索引(index); c. 如果该位置上没有元素,则返回空值(null); d. 如果该位置上有元素,则根据键的 equals 方法在链表或红黑树上查找对应的键值对; e. 如果找到对应的键值对,则返回该键对应的值,否则返回空值(null)。
以上是 HashMap 在 get 和 put 时的基本步骤,其内部实现还涉及到其他细节,例如使用位运算来计算 hash 值、使用链表和红黑树来解决冲突等。