hashmap底层实现原理以及常见的面试问题

hashmap算法优劣标准
1.分布均匀
2.尽量避免冲突

关于hashMap的几个问题
1、hashing的概念
这个是一个hash算法,将Key对象通过hashing的到需要存储值对象的位置bucket。
2、HashMap中解决碰撞的方法
根据key的hashcode得到存储位置bucket,有可能不同的key得到的位置一样这样就出现了hash碰撞。这样就引入了每一个bucket中的一个链表结构来解决碰撞,hashMap如果发生hash碰撞则将键值对象存在链表的下一个节点。
3、equals()和hashCode()的应用,以及它们在HashMap中的重要性
当两个不同的键对象的hashcode一样,他们会存储在同一个bucket位置的链表中,通过遍历这个链表再根据键对象的equals方法用来找到存放在链表中的键值对(Entry)对象。get方法用到equals和hashcode方法,put则用到hashcode方法。
4、不可变对象的好处
用不可变对象作为key,是非常合适的。
1)如果存放时key对象的hashcode和获取时这个key对象的hashcode不一致时则无法获取值对象。
2)不可变对象是线程安全的,减少碰撞的几率。

5、HashMap多线程的条件竞争
当多个线程同时试图去调整hashmap大小的时候,存储在链表的中的元素会反过来,因为移动到新的bucket位置的时候,hashmap并不会将元素放到链表的尾部,而是放在头部,这样是为了避免尾部遍历。这样就可能发生死循环。
6、重新调整HashMap的大小
如果put元素之后发现hashmap的size>当前size*负载因子(默认0.75)时就会对hashmap进行扩0容。扩容过程是创建一个原来map大小的2倍bucket数组,通过新的hash算法将原来的Entry对象存放到新的bucket数组中。这个过程是rehashing过程,这个是非常耗时的,因此在开发中尽量选定合适的初始hashMap大小,尽量减少扩容的发生。
7、hashMap底层数据结构到底是怎样的
hashMap包含一个bucket数组和每一个bucket对应的链表结构,每一个K-V对象存放在这个链表中,这个链表结构主要用来解决hash碰撞后键值对象存储问题。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值