HASHMAP的底层实现原理

hashmap的视线原理:
1:底层使用hash表数据结构,即:数组+链表或红黑树\
    数组的默认长度是0,但是第一添加数据长度会变成16;后面扩容的机制是0.75(0.75这个是根据数学的统计学得出的一个结果,过大过小都会降低效率,所以选择了0.75),当数组达到长度的0.75的时候,就会发生扩容,每次扩容都是按2倍放大;
    为什么是数组而不是链表,因为数组取余查找特别快,比链表快;

2:添加数据的时候,通过计算key值确定元素在数组中的下标
    如果key值相同就会替换
    如果不同则会产生冲突就会存入链表或者红黑树中;
    (转成红黑树会提升性能,当链表太长的时候,遍历链表的时间复杂度较高,红黑树是LOGn;第二会避免dos攻击;)
    获取数据的时候也是通过key的拿到hash值,计算数组下标来获取元素;


 
Hashmap的JDK1.7与1.8的区别
    1:JDK1.8之前是采用拉链法,即数组加链表
        (遇到Hash冲突就会将冲突的值加到链表当中,在极端的情况下,如果hash的余数都一样,就会使得链表过长,效率下降;其次1.8之前采用头插法,头插法当遇到多线程扩容的时候可能会引起死循环)

    2:JDK1.8之后是采用数组+链表+红黑树,当链表长度大于8并且数组的长度大于64 的时候会从链表转化成红黑树
        尾插法(这样就避免了之前的死循环)
        (在扩容的时候红黑树的节点数量小于等于6个就会退化成链表)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值