mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-20 22:17:09 +08:00
Update HashMap.md
This commit is contained in:
parent
d8d16a729f
commit
79cfdc14c6
@ -56,7 +56,7 @@ static int hash(int h) {
|
|||||||
|
|
||||||
所谓 **“拉链法”** 就是:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。
|
所谓 **“拉链法”** 就是:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### JDK1.8之后
|
### JDK1.8之后
|
||||||
相比于之前的版本,jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。
|
相比于之前的版本,jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。
|
||||||
@ -170,7 +170,9 @@ static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {
|
|||||||
```
|
```
|
||||||
## HashMap源码分析
|
## HashMap源码分析
|
||||||
### 构造方法
|
### 构造方法
|
||||||

|
|
||||||
|
HashMap 中有四个构造方法,它们分别如下:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
// 默认构造函数。
|
// 默认构造函数。
|
||||||
public HashMap() {
|
public HashMap() {
|
||||||
@ -237,9 +239,7 @@ HashMap只提供了put用于添加元素,putVal方法只是给put方法调用
|
|||||||
- ①如果定位到的数组位置没有元素 就直接插入。
|
- ①如果定位到的数组位置没有元素 就直接插入。
|
||||||
- ②如果定位到的数组位置有元素就和要插入的key比较,如果key相同就直接覆盖,如果key不相同,就判断p是否是一个树节点,如果是就调用`e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value)`将元素添加进入。如果不是就遍历链表插入(插入的是链表尾部)。
|
- ②如果定位到的数组位置有元素就和要插入的key比较,如果key相同就直接覆盖,如果key不相同,就判断p是否是一个树节点,如果是就调用`e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value)`将元素添加进入。如果不是就遍历链表插入(插入的是链表尾部)。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public V put(K key, V value) {
|
public V put(K key, V value) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user