HashTable, HashMap, ConcurrentHashMap 之间的区别

HashTable

HashTable是线程安全的类,很多方法都是用synchronized修饰,但同时因为加锁导致并发效率低下,单线程环境效率也十分低;但HashTable不允许键或值为null;

HashTable底层数组长度可以为任意值,这就造成了hash算法散射不均匀,容易造成hash冲突,默认为11;

HashTable的hash算法首先使得hash值小于整型数最大值,再通过取模进行散射运算;

HashMap

HashMap是线程不安全的类,多线程下会造成并发冲突,但单线程下运行效率较高;HashMap允许有一个键为null,允许多个值为null;:HashMap底层数组长度必须为2的幂,这样做是为了hash准备,默认为16;

HashMap的hash算法通过非常规设计,将底层table长度设计为2的幂,使用位与运算代替取模运算,减少运算消耗

ConcurrentHashMap

1.使用"锁桶"的方式,来代替"一把全局锁",有效降低锁冲突的概率

另一方面,看起来锁对象多了,实际上也不会产生更多的额外开销Java中每个对象都可以作为锁对象就只需要把synchronized加到链表

一个hash表,上面的hash桶的个数是非常多~~大部分的操作,都没有锁冲突了,(synchronized,如果不产生锁冲突,就是个偏向锁)

2.像hash表的size,即使你插入的元素是不同的链表上的元素,也会涉及到多线程修改同一个变量

3.针对扩容操作做了特殊优化

如果发现负载因子太大了,就需要扩容扩容是一个比较重量比较低效的操作。

化整为零.ConcurrentHashMap会在扩容的时候,搞两份空间.

一份是之前扩容之前的空间一份是扩容之后的空间接下来每次进行hash表的基本操作,都会把一部分数据从I旧空间搬运到新空间

搬的过程中:1.插入=>插入到新的上面2.删除=>新的日的都要删除3.查找=>新的日的都要查找

java8之前,ConcurrentHashMap基于分段锁的方式实现的,

引l入若干个锁对象,每个锁对象管理若干个hash桶相比于Hashtable是进化,但是不如现在直接锁桶代码写起来更复杂

相关推荐
QianhangQianping9 分钟前
撤销重做不是「存快照」:一个可视化编辑器的Operation 设计
java·前端·数据库·typescript·编辑器·前端架构·撤销重做
海绵宝宝转agent14 分钟前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
SunnyDays101115 分钟前
Java 操作 Word 脚注和尾注:添加、读取与删除
java·word
SunnyDays101117 分钟前
Java 为 Word 添加页码:隐藏封面页码、从指定页开始编号、奇偶页页码设置等
java·word·页码
octopus_c20 分钟前
C++ 运算符重载详解 && 日期类的实现
开发语言·c++
开源推荐官21 分钟前
多门店 O2O 商城选型复盘:从开发视角对比主流开源系统
java·架构·开源·php
吴名氏.22 分钟前
Java转AI Agent教程(第二周)超时重试与错误分类
java·人工智能·python·分类·ai agent
Eiceblue24 分钟前
用 Python 给 Word 文档加水印:文字、图片与批量处理
开发语言·vscode·python·word
j7~29 分钟前
【C++ 面试笔记】(篇二):类与数据抽象 & STL 容器与算法
开发语言·c++·面试·stl容器和算法·类和数据抽象
Fuyo_11191 小时前
深入解析 C++ unordered_set 与 unordered_map 的核心特性与性能实战
开发语言·c++