欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅谈hashMap

程序员文章站 2022-10-04 09:07:39
浅谈HashMapHashMap的特性?1.HashMap 存储键值对实现快速存取,允许为 null。key 值不可重复,若 key 值重复则覆盖。2.非同步,线程不安全。3.底层是 hash 表,不保证有序(比如插入的顺序)HashMap的底层原理是什么?基于 hashing 的原理,jdk8 后采用数组+链表+红黑树的数据结构。我们通过put 和 get 存储和获取对象。当我们给 put()方法传递键和值时,先对键做一个 hashCode()的计算来得到它在 bucket 数组中的位置来存储...

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