hashMap总结

1.为什么hashMap的大小为2^n?

hashMap大小如果不是为2^n,在hash&(n-1)的时候就会干扰到值,

假设初始化大小为7,则hash& 6在运算的时候,6的二进制是0110

在这里插入图片描述
如图,大小如果不是为2^n,做与运算的时候就会干扰hash得值。如果是二的幂次方,结果为0111,能保证数据不被干扰到。

2.求下标位置i = (n - 1) & hash

​ i = (n - 1) & hash等价于hash % n,因为计算机中与运算速度比%运算快, (n - 1) & hash就是保证了结果值永远在数组的范围内,不会超过数组大小
​ n是2n,则**2n-1转成二进制是0后面n个1**,保证了高位为0做&运算的时候永远是0,低位做&运算的时候看hash值。

在这里插入图片描述

3.hash函数怎么来的?

hash函数是高16和低16为做异或运算

4.扩容根据什么来判断node在新数组位置?

在这里插入图片描述

面试题
  1. Hash原理,内存数据结构

    ​ 底层使用哈希表(数组+链表),当链表过长试试会将链表转成红黑树来实现

  2. 讲一下hashmap的put方法过程

    ​ a 对key求hash值,然后再计算下标

    ​ b.如果没有碰撞,直接放入桶中

    ​ c.如果碰撞了,以链表方式链接到后面

    ​ d.如果链表长度超过阈值(8),就将链表转成红黑树

    ​ e.如果节点已经存在就替换旧值

    ​ f.如果桶满了(容量+加载因子),则需要扩容

  3. hashmap中hash函数怎么来的?还有哪些实现hash方式?

    a.高16bit 与低bit 做 异或

    b.(n-1)& hash 得到下标

  4. hash怎么解决冲突,讲一下扩容过程,加入一个值在原数组中,现在移动了新数据,位置肯定发生变化了,那是什么定位到这个值新数组中的位置

    a.将新节点加到链表后

    b. 容量扩容为原来的2倍,然后对每个节点重新计算哈希值

    c.这个值可能在两个地方,一个是原下标位置,另一种下标为 <原下标+原容量>的位置

  5. 抛开hashmap, hash冲突有哪些解决办法

    开放定址,莲地址法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HashSet和HashMap都是Java集合框架中的容器类,它们之间有一些区别。 HashSet是基于HashMap实现的,它只存储了key,并且key不会重复,使用HashSet可以达到去重的效果。在HashSet内部,它的元素是无序的,因为它是通过哈希算法来存储和访问元素的。 而HashMap是一种键值对的映射表,它存储了key和value,key不会重复,而value可以重复。HashMap内部使用哈希表来存储和访问元素,它根据key的哈希值来确定元素在哈希表中的位置。HashMap是无序的,因为它并不维护元素的插入顺序。 相比之下,LinkedHashMap也是基于HashMap实现的,它在HashMap的基础上维护了一个双向链表来记录元素的插入顺序。因此,LinkedHashMap可以保持元素的插入顺序,它是有序的。 总结起来,HashSet适用于需要去重的场景,HashMap适用于需要通过键值对来进行查找的场景,而LinkedHashMap适用于需要保持元素插入顺序的场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [HashMap和HashSet](https://blog.csdn.net/m0_67683346/article/details/126068054)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Java中HashSet和HashMap的区别_动力节点Java学院整理](https://download.csdn.net/download/weixin_38732744/12781399)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值