并发中的Map容器

本文介绍了并发环境下Map容器的选择,重点关注HashMap的工作原理及其线程安全问题。HashMap在多线程操作中可能出现脏读、数据覆盖和扩容死循环等问题。相比之下,HashTable和Collections.synchronizedMap提供了线程安全性,但仍有局限。最后提到了并发环境下推荐的ConcurrentHashMap,它是从Java 1.5开始引入的并发Map实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。  

上几篇讨论了并发环境下list容器的操作, 本篇我们来聊下另外一个集合容器:Map

家族体系

Map:以key-value对的形式存在,一种数据结构,一个key, 映射一个value值, map中不能包含重复的key值, 一个key最多只能映射到一个值。
常用方法有:
添加: V put(K key, V value);
删除: V remove(Object key);
修改: V put(K key, V value);
查询: V get(Object key);

常见的实现类:
HashMap
LinkedHashMap
TreeMap
Hashtable
ConcurrentHashMap

HashMap

要研究HashMap在并发环境下使用, 先得了解hashmap实现原理.HashMap是基于哈希表的 Map 接口的实现。(传送门:哈希表百度百科),其底层维护一个数组与链表.源码说话:
注意:
jdk8以前hashMap结构: 数组 + 链表
jdk8以后hashMap结构: 数组 + 链表 + 红黑树
此处源码使用的jdk8
源码:

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable {
    //初始容量, 默认16,俗称桶, 可以认为数组长度
    //一个桶对应一条链表
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
    //默认负载因子
    static final float DEFAULT_LOAD_FACTOR = 0.75f;
    //真实的负载因子, 不特意指定是等于0.75f;
    final float loadFactor;
    //阈值:所能容纳kv对最大数量,超过这个值,则需扩容
    //规则: threshold = capacity * loadFactor
    int threshold;
    //哈希表, 如果必要, 长度以2的n次方方式拓展
    transient Node<K,V>[] table;
}
static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next;
        Node(int hash, K key, V value, Node<K,V> next) {
            this.hash = hash;
            this.key = key;
            this.value = value;
            this.next = next;
        }
}

HashMap运作规则:
JDK8 HashMap结构图
1>HashMap 初始化时(不特意指定), 默认创建长度为16的一维数组, 用于保存Node(即kv对)/挂载链表投节点

public HashMap() {
        this.loadFactor = DEFAULT_LOAD_FACTOR; 
}

2>map添加元素时map.put(key, value), 先通过哈希算法h = hash(key)计算出当前Node(key, value)在table数组中位置, 如果table[h]位置为null.table[h] = Node(key, valu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值