Java之HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap简单的区别

一、 HashMap

1)底层实现 
数组+链表+红黑树(在JDK1.8中如果链表长度大于8的时候才转换为红黑树)


2)是否线程安全
不支持线程的同步,线程不安全,如需同步,可用Collections的synchronizedMap方法或者使用ConcurrentHashMap,调用这个对象的方法使HashMap具有同步的能力。


3)插入值操作过程

public synchronized V put(K key, V value) {// Make sure the value is not nullif (value == null) {throw new NullPointerException();}// Makes sure the key is not already in the hashtable.Entry<?,?> tab[] = table;int hash = key.hashCode();int index = (hash & 0x7FFFFFFF) % tab.length;@SuppressWarnings("unchecked")Entry<K,V> entry = (Entry<K,V>)tab[index];for(; entry != null ; entry = entry.next) {if ((entry.hash == hash) && entry.key.equals(key)) {V old = entry.value;entry.value = value;return old;}}addEntry(hash, key, value, index);return null;}


4) 特点
HashMap最多只允许一条记录的键为null,允许多条记录的值为null,然后和插入效率高,但是插入的数据是无序的插入、删除和定位元素,HashMap是最好的选择


5)hashmap什么时候进行扩容
当hashmap中的元素个数超过数组大小loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,也就是说,默认情况下,数组大小为16那么当hashmap中元素个数超过160.75=12的时候就把数组的大小扩展为2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作。

 

 

 

 

 

 

二、 Hashtable


1)底层实现
它继承自Dictionary类

2)是否线程安全
支持线程的同步,线程安全,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢

 

 

 

 

 

 

 

三、LinkedHashMap


1)底层实现
双向链表+HashMap(LinkedHashMap是继承于HashMap)


2) 是否支持线程安全
不支持线程的同步,线程不安全


3)特点
保存了记录的插入顺序,也就是数据是有序的,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的, 也可以在构造时用带参数,按照应用次数排序,一般在遍历的时候会比HashMap慢,有HashMap的全部特性,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

 

 


四、TreeMap


1)底层实现
红黑树


2)是否线程安全
不支持线程的同步,线程不安全


3)特点
TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的

 

 

 

 

五、ConcurrentHashMap


1)底层实现
拓展了Hashtable,底层采用分段的数组+链表实现


2)是否线程安全
支持线程的同步,线程安全,即任一时刻只有一个线程能写ConcurrentHashMap。


3)特点
锁分离技术,段内扩容,ConcurrentHashMap对分开两次操作也是安全的。
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《零基础看得懂的C语言入门教程 》——(八)了解基本数组还不是那么简单

一、学习目标 了解数组的使用方法 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离学习误区 第二篇&#xff1a;&#xff08;二&#xff09;C语言没那么难简单开发带你了解流程 第…

推导坐标旋转公式(转)

在《Flash actionScript 3.0 动画教程》一书中有一个旋转公式&#xff1a; x1cos(angle)*x-sin(angle)*y; y1cos(angle)*ysin(angle)*x; 其中x&#xff0c;y表示物体相对于旋转点旋转angle的角度之前的坐标&#xff0c;x1&#xff0c;y1表示物体旋转angle后相对于旋转点的坐标 …

任务管理平台_jytask一个任务调度统一管理平台

task介绍和使用https://gitee.com/yuejing/task 下的文档&#xff1a;[doc/task介绍和使用.docx]task是什么&#xff1f;task是一个任务调度统一管理平台。 目前主要是通过http来进行任务的调度&#xff0c;http支持签名算法。一张图能更加懂它是做什么的(一个集中管理任务的平…

设计一个支持百万用户的系统

设计一个支持数百万用户的系统是非常有挑战性的, 这是一个需要不断调整和优化的过程, 接下来的内容中, 我将构建一个系统, 从单个用户开始&#xff0c;到最后支持数百万的用户。从单个服务开始 千里之行&#xff0c;始于足下&#xff0c;让我们从最简单的单个服务开始。所有的…

SQL Server T-SQL编程:数据库用户与安全设置

目录 一、数据库的注册、用户建立 二 、用户安全设置:角色

原百万访问量博客http://blog.chinaunix.net/uid/20656672.html不再维护(10年前数百篇oracle/teradata性能优化、故障处理案例)...

原博客地址http://blog.chinaunix.net/uid/20656672.html不再维护&#xff08;数百篇oracle/teradata性能优化、故障处理原创文章&#xff09;转载于:https://www.cnblogs.com/zhjh256/p/5497797.html

《零基础看得懂的C语言入门教程 》——(九)C语言二维数组与循环嵌套

一、学习目标 了解二维数组的使用方法了解循环嵌套的使用方法 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离学习误区 第二篇&#xff1a;&#xff08;二&#xff09;C语言没那么…

LRU算法

1 LRU算法 LRU(Least recently used,最近最少使用)根据数据的历史访问记录来进行淘汰数据,思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。 2 具体实现过程 新数据插入到链表头部; 每当缓存命中(即缓存数据被访问),则将数据移到链表头部; 当链表满…

Scala-2.13.0 安装及配置

Scala 简介 Scala 是一门多范式&#xff08;multi-paradigm&#xff09;的编程语言&#xff0c;设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在Java虚拟机上&#xff0c;并兼容现有的Java程序。 Scala 源代码被编译成Java字节码&#xff0c;所以它可以运…

检测python进程是否存活

crontab -e */3 * * * * /data/log_realtime/check.sh > /data/log_realtime/check.log 2>&1 1 0 1 * * /data/jx3log_import_realtime/shutdown.sh 说明&#xff1a;每3分钟检查一次进程是否存在&#xff0c;每个月1号0点1分杀掉进程&#xff0c;重启 check.sh cd …

中科大镜像源_JETPACK4.4安装软件和备份镜像的方法介绍

一、使用SDK Manager的文件夹安装Jetson软件(以NX为例)当JETPACK安装出现错误的时候&#xff0c;可以尝试下面的安装办法&#xff0c;前提是JETPACK4.4完整安装(即本文第三节的下载已经完成)&#xff0c;并且选择JETSON NX的相关的下载已经完成。安装步骤&#xff1a;1、$cd /n…

站在前人的肩膀上重新透视C# SpanT数据结构

先谈一下我对Span的看法&#xff0c; Span是指向任意连续内存空间的类型安全、内存安全的视图&#xff0c;可操作的滑动窗口。Span和Memory都是包装了可以在pipeline上使用的结构化数据的内存缓冲器,他们被设计用于在pipeline中高效传递数据。定语解读这里面许多定语&#xff0…

集合学习

List集合&#xff1a;ArrayList集合基于动态数组结构&#xff0c;查询优&#xff0c;LinkedList 基于链表结构 数据移动优。是一个有序的队列集合 set集合&#xff1a;HashSet和TreeSet 。是一个无序不重复集合 Map集合&#xff1a;HashMap和TreeMap。是一个KEY-VALUE映射的集合…

《零基础看得懂的C语言入门教程 》——(十)C语言的指针原来是这样

一、学习目标 了解指针的概念了解指针的使用方法了解双重指针 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离学习误区 第二篇&#xff1a;&#xff08;二&#xff09;C语言没那…

T-SQL编程基础之一:变量与基本语句

一个标准的计算机语言,大概要提供的必要主要功能是:变量说明、分支判断、循环和输入输出结果。T-SQL也一样,具有这些功能,只不过T-SQL的输入和输出不是界面,而是表。 完全精确描述一个计算机语言,大概要很厚的书才能做到,好在目前这些书籍的发行也很多,许多书描述的都…

Java之volatile如何保证可见性和指令重排序

1 我们先了解CPU缓存 CPU缓存为了解决CPU运算速度与内存读写速度不匹配的问题&#xff0c;因为CPU运算速度要比内存读写速度快得多 一次主内存的访问通常在几十到几百个时钟周期一次L1高速缓存的读写只需要1~2个时钟周期一次L2高速缓存的读写也只需要数十个时钟周期 CPU大多数…

bigpipe提升网站响应速度

2019独角兽企业重金招聘Python工程师标准>>> 主要思想就是通过异步 发起一次请求&#xff0c;后端不关闭输出流&#xff0c;多个线程处理各自任务&#xff0c;然后分别发送到客户端。 https://github.com/4rnold/Demo-Project/tree/master/bigpipe-demohttps://gith…

mysql 添加用户_mysql创建用户与授权

一、创建用户CREATE USER usernamehost IDENTIFIED BY password;说明username&#xff1a;你将创建的用户名host&#xff1a;指定该用户在哪个主机上可以登陆&#xff0c;如果是本地用户可用localhost&#xff0c;如果想让该用户可以从任意远程主机登陆&#xff0c;可以使用通配…

《零基础看得懂的C语言入门教程 》——(十一)C语言自定义函数真的很简单

一、学习目标 了解C语言的自定义函数的使用方法了解C语言自定义函数的传参了解C语言自定义函数的返回值 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离学习误区 第二篇&#xf…

T-SQL编程基础之二:条件选择、循环编程

1. 条件判断以及GOTO语句 条件判断是计算机语言的重要功能,在T-SQL中,条件判断的语句是: if 条件 … else … 或者是: if 条件 … 注意写法和C类似,但条件描述不使用()也可以。如果是在一个条件里执行多条语句,则要构造复合语句,复合语句是在BEGIN…EDN中构造…