浅谈hashMap

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 比较内容获取值对象

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值