java基础总结(面试高频问题)四:Hashtable,HashMap,ConcurrentHashMap底层原理及线程安全

1:HashMap原理概述:
假设存在一个数组,数组中每个元素都是一条链表。当要添加一个新元素(key-value)进入数组时,就要先根据key值计算hash值,以此确定要插入数组的位置。但是可能该位置已经存在相同hash值的其他元素,这就是哈希冲突,处理方法是把这一新元素添加到旧元素的后面,他们在数组的同一位置,但是形成了链表的存在形式。也就说数组中存放的是无数的链表,每一条链表的hash值都是相同的。而当链表长度超过阈值8的时候,链表就转为红黑树,这样大大提高了查找的效率;
JDK1.6和JDK1.7中,HashMap采用的是数组+链表的形式来处理哈希冲突,当同一hash值的元素过多时,通过key值依次查找的效率就降低了。在JDK1.8中,HashMap采用了数组+链表+红黑树的形式实现,当链表长度超过阈值8时,就将链表转换为红黑树,这样大大减少了查找时间;

2:不同key值为什么计算出的hash值相同:
举一个例子,如果学校要把学生的成绩存入数据库,需要保存的信息有姓名和成绩;我们把学生的姓名作为key值,通过hash算法把key值转换为hash值,这里就假设按照(学生姓名的拼音字母数长度)%(数组长度)来作为hash值,数组长度假设为10。可以发现,不同姓名的学生,其姓名拼音长度可能是一样的,那么计算出的hash值就是一样的,我们把hash值一样的学生成绩存放在数组的同一个位置下,这就形成了链表,通过遍历链表中元素的key值来找到要查询的学生的成绩即可。
详解可以看:https://www.zhihu.com/question/355013552

3:HashMap实现原理:
HashMap的主干是一个Entry数组,Entry数组是HashMap的基本组成单元,每一个Entry都包含一个key-value键值对;
其结构原理图如下:

在这里插入图片描述
结合原理图可以看出,HashMap是由数组+链表组成的,数组是HashMap的主体,链表是为了解决哈希冲突存在的。如果定位到数组的某个位置,发现不含链表(当前entry的next指向null),对于查找,添加等操作而言,是非常迅速的,仅需一次操作即可。如果定位到数组的某个位置,发现包含链表,对于添加操作,其时间复杂度为O(n),需要遍历链表,存在即覆盖,否则新增。对于查找操作,仍需遍历链表,并通过equals 方法逐一比对key值。根据这一规律可以看出,HashMap中出现的链表越少,其性能才能越好;
JDK1.8新加红黑树实现:

在这里插入图片描述
5:ConcurrentHashMap的实现原理:
(1)ConcurrentHashMap是从JDK1.5开始引入的,主要是为了解决HashMap线程不安全以及Hashtable效率不高的问题ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值