自己对HashMap底层的一点了解

对于hashmap的底层,我这确实看不太懂,但是为了面试会被问到,经常会看其他大牛对hashmap的原理解释,现在我来总结一下hashmap的一些知识点。

HashMap的底层主要是基于数组和链表来实现的

HashMap中主要是通过key的hashCode来计算hash值然后取余获得索引, 因为hash值太多了,不可能给每一个hash分配一个数组空间,但是有可能出现计算出来的hash值相同的可能(只要key的hashCode值相等),这就是hash冲突,我们通过链地址法来解决hash冲突。


我们会在冲突的位置建立一个链表,然后将冲突的元素插入到列表的尾端。

在链表长度大于或等于8的时候会转换为红黑树(jdk1.8),jdk1.7的时候是会转换成二叉树


负载因子:尺寸/容量,空表的时候负载因子是0,半满的负载因子是0.5,负载轻的表,出现冲突的可能新小,因为对于插入和查找都是最理想的。

当负载因子达到0.75的时候就会进行链表的加倍,2倍

hashmap的默认容量是16,键值可以为null

(hashtable默认容量是11,键值不能为null)


为什么要扩容两倍,是因为hashmap和内部的一个算法有关系(n-1)&hash,&能让计算机直接计算,当hashmap的容量为2的n次幂时候(n-1)的2进制都是1,这样添加元素的hash值进行位运算的时候能够充分的散列,使添加的元素均匀分布在hashmap的每个位置,减少hash碰撞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值