java基础之容器(二)HashMap底层原理与面试回答

本文探讨了Java中HashMap的特点,如O(1)的增删查操作,允许NULL键和值,以及扩容机制。文章深入讲解了扰动函数的作用,以减少hash碰撞。在JDK1.7中,HashMap使用数组加链表的数据结构,但在多线程环境下可能导致死循环。JDK1.8引入了红黑树,解决了死循环问题并优化了查找效率,链表转树的阈值设定考虑了避免频繁转换的因素。
摘要由CSDN通过智能技术生成

 

特点:增,删,查的时间复杂度都是O(1)。

存储KEY可以为Null且唯一,Value可为NULL;扩容(初始大小为16(2的次幂),负载因子为0.75,扩容至原大小的2倍);

概念:扰动函数(hash函数):使用hash函数,是避免使用较差的hashCode();从而减少hash碰撞的发生。

 

JDK1.7

数据结构: 数组加链表(单向);线程不安全、多线程下会发生死循环;

数组加链表的结构:HashMap中的内部类Entry组成的数组;计算数组下标:自身实现的hash()算法,并做异或运算再取模得到对应的数组下标位置;自写hash算法的好处在于,减少了hash碰撞的发生。

代码如下:key的hashCode值,9次扰动处理=4次位运算+5次异或。

 

final int hash(Object k) {
    int h = hashSeed;
    if (0 != h && k instanceof String) {
        return sun.misc.Hashing.stringHash32((String) k);
    }

    h ^= k.hashCode();

    h ^= (h >>> 20) ^ (h >>> 12);
    return h ^ (h >>> 7) ^ (h >>> 4);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值