浅谈hashMap

2022-08-02,

HashMap的特性?

1.HashMap 存储键值对实现快速存取,允许为 null。key 值不可重复,若 key 值重复则覆盖。
2.非同步,线程不安全。
3.底层是 hash 表,不保证有序(比如插入的顺序)

HashMap的底层原理是什么?

基于 hashing 的原理,jdk8 后采用数组+链表+红黑树的数据结构。我们通过put 和 get 存储和获取对象。当我们给 put()方法传递键和值时,先对键做一个 hashCode()的计算来得到它在 bucket 数组中的位置来存储 Entry 对象。当获取对象时,通过 get 获取到 bucket 的位置,再通过键对象的 equals()方法找到正确的键值对,然后在返回值对象。

HashMap中put是如何实现的?

1.计算关于 key 的 hashcode 值(与 Key.hashCode 的高 16 位做异或运算)
2.如果散列表为空时,调用 resize()初始化散列表
3.如果没有发生碰撞,直接添加元素到散列表中去
4.如果发生了碰撞(hashCode 值相同),进行三种判断
4.1:若 key 地址相同或者 equals 后内容相同,则替换旧值
​ 4.2:如果是红黑树结构,就调用树的插入方法
​ 4.3:链表结构,循环遍历直到链表中某个节点为空,尾插法进行插 入,插入之后判断链表个数是否到达变成红黑树的阙值 8;也可以遍历到有节点与插入元素的哈希值和内容相同,进行覆盖。

5.如果桶满了大于阀值,则 resize 进行扩容

HashMap中get是如何实现的?

对 key 的 hashCode 进行 hashing,与运算计算下标获取 bucket 位置,如果在桶的首位上就可以找到的就直接返回,否则就在树中找或者链表中遍历找,如果有 hash 冲突,则利用 equals方法去遍历链表查找节点。

进行存储时候当两个对象的hashCode相等时会怎么样?

会产生哈希碰撞,若 key 值相同则替换旧值,不然链接到链表后面,链表长度超过阙值 8就转为红黑树存储

如果两个键的hashcode相同,改如何获取值对象?

HashCode 相同,通过 equals 比较内容获取值对象

如果HashMap的大小超过了负载因子(load factor) 定义的容量,会怎样?

超过阙值会进行扩容操作,概括的讲就是扩容后的数组大小是原数组的 2 倍,将原来的元素重新hashing 放入到新的散列表中去。

HashMap的参数 loadFactor的作用:

loadFactor 表示 HashMap 的拥挤程度,影响hash操作到同一个数组位置的概率。默认loadFactor 等于 0.75,当 HashMap 里面容纳的元素已经达到 HashMap 数组长度的 75%时,表示 HashMap 太挤了,则需要扩容,HashMap 的构造器中可以定制 loadFactor。

本文地址:https://blog.csdn.net/m0_47790260/article/details/107328198

《浅谈hashMap.doc》

下载本文的Word格式文档,以方便收藏与打印。