哈希

一. hashcode和equals:
1.是什么:
都是用来比较两个对象是否相同的一种方法
2.为什么重写equals还要重写hashcode方法:
为了保证,equals比较相同的两个对象,hashcode也一定相同。
3.为什么有equals还需要hashcode?
两个对象通过equals()比较相同,那么他们的hashcode()也一定相同。反之,则不会。但是由于hashcode比较的效率更高,所以通常采用先用hashcode()比较,当hashcode不同就不需要进行equals比较,如果hashcode相同,我们再进行equals比较,这样做既提高了效率,同时也确保了结论的准确性。

二.hash表是如何插入元素的
1.根据key 哈希函数,计算hash值
2.按照哈希值找到数组具体元素
3.数组默认是个链表,把新的值构造节点,追加到链表之后。
4.如果链表长度大于八转成红黑树,(如果红黑树长度小于等于6,转成链表)
5.若已经是红黑树,按照红黑树的规则插入。
6.插入完毕,判定是否需要扩容(降低冲突概率,提高效率)
关于扩容:
1.数组容量保持2^n
2.扩容相当于创建一个长度更长的数组,把原来的元素重新插入到新数组,再释放旧的数组。

三.哈希冲突
1.是什么?
指不同的元素通过相同的哈希函数得到了相同的位子。

2.如何避免哈希冲突?
(1)构造合理的哈希函数
(2)降低负载因子

3.如何解决哈希冲突?
(1)开散列:哈希桶
(2)闭散列:线性探测法,插值探测法
用链表来处理哈希冲突,链表如果长度较长超过8,就会把链表转成红黑树(平衡二叉搜索树)。如果红黑树长度《=6,又会转成链表。
hash值就是哈希函数得到的结果,转成下标就需要进一步%数组长度。(桶个数)。
两个哈希值不同,key一定不同。
两个key相同,哈希值一定相同。
key不同,hash值可能相同。

四.HashTable和ConcurrentHashMap
1.共同点:都是线程安全的
2.差别:HashTable每个方法用sychronized修饰,导致效率较低,一般不太用。
ConcurrentHashMap:
(1)充分利用了CAS(把读取判断操作和修改操作设置成原子操作,可以在用户态实现轻量级锁)
(2)使用若干小锁,每个哈希桶一个锁
(3)优化了扩容

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值