HashMap&HashSet底层实现原理探究

1.1HashMap底层实现
HashMap底层是数组加链表的形式实现,根据K的hashcode找到数组的下标,然后将元素添加到链表中,在这里需要注意一点,hashmap底层数组的长度永远是2的次幂,
Hash值的取值范围是-2147483648-2147483647,只要保证足够松散,那么就会降低哈希冲突,那么,40亿的取值范围太大,内存放不下的,需要做单独的优化,那么这个算法是什么,就是对数组长度%求模,取余数获得数组下标,但是计算机的求模效率很低,&的效率是最高的,那么这个公式就是这样:hash%length==hash&(length-1),满足这个公式的唯一条件是length的值为2的幂次方.
那么为什么这样的算法效率高,2的幂次方的二进制数都是1后面n个0,而2的幂次方-1二进制数为n个1,1的&操作效率高…由此求出数组的下标.

展开来说java1.8中对hashMap添加的黑红树
当hash冲突,也就是数组中的链表元素个数大于8的时候,会转为黑红数,当hash冲突小于6的时候会转换为链表
当大于8个的时候,树的查找次数是log(n)次,也就是3次,而此时链表的查询次数为8/2=4次,效率会高
但当冲突小于6的时候,链表的查询次数是3次,此时,全部生命周期中链表的效率,要高于黑红数,因为黑红数的创建所消耗的时间要远超过所需查询的时间
同时,中间的7的设定是为了防止反复转换数据结构,比如频繁添加删除元素时,如果大于8黑红树,小于8链表,那么会有大量资源被开销浪费在此
1.2HashMap补充
1.hashmap如果想用类对象为k,那么此类必须重写hashCode()方法和equals方法,并保持一致,这个类的hashcode返回值一样时equals应该返回true
1.3HashSet底层实现
hashSet底层是由hashmap实现的,元素被存放在hashmap中的k中,储存时,先判断该元素Hash值,如果下标为空直接存储,如果不为空,比较两个元素的hashcode值,如果一直,则比较equals的值,如果true一样就不存,视为同一个元素,如果false不一样,则存在该下标的链表中
如果想让不同的值视为相等的,那么就要覆写hashcode方法和equeals方法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值