(java面试) 11. HashMap和ConcurrentHashMap的区别,HashMap的底层源码

本文详细对比了HashMap和ConcurrentHashMap在数据结构和并发处理上的区别,解释了HashMap的内部实现,包括其数据结构、属性、构造方法以及put方法的储存过程。HashMap基于数组+链表解决冲突,而ConcurrentHashMap通过分段锁提高并发性能。在HashMap的源码分析中,讨论了加载因子、初始容量和扩容策略,以及如何通过hash值计算存储位置。
摘要由CSDN通过智能技术生成

HashMap和ConcurrentHashMap的区别:

Hashmap本质是数组加链表。根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面。所以他不保证映射的顺序。

ConcurrentHashMap:在hashMap的基础上,ConcurrentHashMap将数据分为多个segment,默认16个(concurrency level),然后每次操作对一个segment加锁,避免多线程锁的几率,提高并发效率。

HashMap的底层源码:

一. 数据结构

Map将实际数据存储在Entry类的数组中。

transient Entry[] table;    //HashMap的成员变量,存放数据  

static class Entry<K,V> implements Map.Entry<K,V> {    //内部类Entry  
    final K key;  
    V value;  
    Entry<K,V> next;     //指向下一个数据  
    final int hash;  

    /** 
     * Creates new entry. 
     */  
    Entry(int h, K k, V v, Entry<K,V> n) {  
        value = v;  
        next = n;  //hash值冲突后存放在链表的下一个
        key = k;  
        hash = h;  
    }

HashMap其实就是一个Entry数组,Entry对象中包含了键和值,其中next也是一个Entry对象,它就是用来处理hash冲突的,形成一个链表。

执行put方法时,根据key的hash值来计算放到table数组的下标,如果hash有相同的下标,则新put进去的元素放到Entry链的头部。

二. 属性与构造方法

属性:
static final int DEFAULT_INITIAL_CAPACITY = 16;  //默认的初始大小,如果执行无参的构造方法,则默认初始大小为16  
static final int MAXIMUM_CAPACITY = 1 << 30;  //最大容量,1073741824  
static final float DEFAULT_LOAD_FACTOR = 0.75f;  //默认的负载因子,如果没有通过构造方法传入负载因子,则使用0.75。  
transient Entry[] table;   //存放具体键值对的Entry数组  
transient int size;   //存放元素的个数 
int threshold;    //阀值  threshold = (int)(capacity * loadFactor); 即容量*负载因子,执行put方法时如果size大于threshold则进行扩容,后面put方法将会看
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值