hahsmap如何get和put的源码
时间: 2024-03-21 14:37:40 浏览: 21
HashMap 是 JDK 中提供的一个哈希表实现类,其底层实现使用数组+链表(或红黑树)的方式实现。下面是 HashMap 中 put() 和 get() 方法的源码分析:
1. put() 方法源码:
```java
public V put(K key, V value) {
// 计算 key 的哈希值
int hash = hash(key);
// 根据哈希值计算数组下标
int i = indexFor(hash, table.length);
// 如果该位置还没有元素,则直接将新元素插入
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
// 如果 key 已经存在,则替换原有的值
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
// 如果该位置已经有元素,则将新元素插入链表头部
modCount++;
addEntry(hash, key, value, i);
return null;
}
```
2. get() 方法源码:
```java
public V get(Object key) {
if (key == null)
return getForNullKey();
// 计算 key 的哈希值
int hash = hash(key);
// 根据哈希值计算数组下标
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
// 如果 key 已经存在,则返回对应的值
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
// 如果 key 不存在,则返回 null
return null;
}
```
可以看出,put() 方法先根据 key 的哈希值计算数组下标,然后遍历该位置的链表,如果找到了已经存在的 key,则替换对应的 value,如果没有找到,则将新元素插入链表头部。get() 方法也是先根据 key 的哈希值计算数组下标,然后遍历该位置的链表,如果找到了已经存在的 key,则返回对应的 value,如果没有找到,则返回 null。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)