java hashmap容器 一些实现分析
Published on 2022-11-17 23:02 in 暂未分类 with 林动

java hashmap容器 一些实现分析

    hashmap

    我们知道,位运算的代价比求模运算小的多,因此在进行这种计算时用位运算的话能带来更高的性能。

    确定桶下标的最后一步是将 key 的 hash 值对桶个数取模:hash%capacity,如果能保证 capacity 为 2 的 n 次方,那么就可以将这个操作转换为位运算。

    static int indexFor(int h, int length) {
        return h & (length-1);
    }
    

    为了让查找的成本降低,应该使 N/M 尽可能小,因此需要保证 M 尽可能大,也就是说 table 要尽可能大。HashMap 采用动态扩容来根据当前的 N 值来调整 M 值,使得空间效率和时间效率都能得到保证。

    和扩容相关的参数主要有:capacity、size、threshold 和 load_factor。

    当需要扩容时,令 capacity 为原来的两倍。

    扩容使用 resize() 实现,需要注意的是,扩容操作同样需要把 oldTable 的所有键值对重新插入 newTable 中,因此这一步是很费时的。

    链表转红黑树
    从 JDK 1.8 开始,一个桶存储的链表长度大于等于 8 时会将链表转换为红黑树。
    9. 与 Hashtable 的比较
    Hashtable 使用 synchronized 来进行同步。
    HashMap 可以插入键为 null 的 Entry。
    HashMap 的迭代器是 fail-fast 迭代器。
    HashMap 不能保证随着时间的推移 Map 中的元素次序是不变的。

    ConcurrentHashMap 和 HashMap 实现上类似,最主要的差别是 ConcurrentHashMap 采用了分段锁(Segment),每个分段锁维护着几个桶(HashEntry),多个线程可以同时访问不同分段锁上的桶,从而使其并发度更高(并发度就是 Segment 的个数)。

    Segment 继承自 ReentrantLock。

    posted @   林动  阅读(10)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · winform 绘制太阳,地球,月球 运作规律
    · 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
    · TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
    · AI 智能体引爆开源社区「GitHub 热点速览」
    · 写一个简单的SQL生成工具
    点击右上角即可分享
    微信分享提示