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对分开两次操作也是安全的。
Java之HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap简单的区别相关推荐
- Java—Map集合详解(HashMap/Hashtable/LinkedHashMap/Properties/TreeMap/WeakHashMap/IdentityHashMap/EnumMap)
关注微信公众号:CodingTechWork,一起学习进步. Map Map集合介绍 Map(也称为字典.关联数组)是用于保存具有映射关系的数据,保存两组值,key和value,这两组值可以是任何 ...
- Java中的Map集合及其子类HashMap,LinkedHashMap,TreeMap,ConcurrentHashMap
一 .Map public interface Map<K,V> 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.此接口哦取代了Dictionary类,后者完全是 ...
- Java中HashMap、LinkedHashMap和TreeMap区别使用场景
1. HashMap中k的值没有顺序,常用来做统计. 2.LinkedHashMap吧.它内部有一个链表,保持Key插入的顺序.迭代的时候,也是按照插入顺序迭代,而且迭代比HashMap快. 3. T ...
- 【面试专栏】第五篇:Java基础:集合篇-LinkedHashMap、ConcurrentHashMap、TreeMap
- HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底层实现。
HashSet与HashMap区别 HashMap实现了Map接口 HashSet实现了Set接口 HashMap储存键值对 HashSet仅仅存储对象 HashMap使用put()方法将元素放入 ...
- java中HashMap,LinkedHashMap,TreeMap,HashTable的区别
java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap Map主要用于存储健值对,根 ...
- HashMap、HashTable、ConcurrentHashMap、HashSet区别 线程安全类
HashMap专题:HashMap的实现原理--链表散列 HashTable专题:Hashtable数据存储结构-遍历规则,Hash类型的复杂度为啥都是O(1)-源码分析 Hash,Tree数据结构时 ...
- HashMap和LinkedHashMap的比较使用
由于现在项目中用到了LinkedHashMap,并不是太熟悉就到网上搜了一下. import java.util.HashMap; import java.util.Iterator; import ...
- JAVA day20、21 双列集合Map<K,V>:HashMap,LinkedHashMap,TreeMap,Hashtable, ConcurrentHashMap;JDK1.9新特性
一.Map<K,V> Java提供了专⻔的集合类⽤来存放这种这种⼀⼀对应的关系,叫做映射对象,即 java.util.Map 接⼝. 类型参数: K - 此映射所维护的键的类型 V - 映 ...
最新文章
- Android5.1.1源码 - zygote fork出的子进程如何权限降级
- php预测,趋势预测法-PHP实现
- python中的enumerate函数
- python中object是什么数据类型_自学Python2.1-基本数据类型-字符串str(object) 上
- 1323. 6 和 9 组成的最大数字
- Java输出数字到文本文件FileWriter
- 某LINUX平台,管道open直接崩溃
- 360携手HarmonyOS打造独特的“天气大师”
- 知识付费与内容付费的区别
- php计算圆的面积怎么带单位_圆的面积计算公式的教学演示工具的制作方法
- js中ajax提交表单提交表单提交,JS中ajax请求提交form表单
- 音乐格式转换软件测试工资,无损音乐如何转换 无损音乐格式转换 无损音乐转换器...
- WIN10家庭版增加本地安全策略
- 使用vue制作网页导航栏
- Mcad学习笔记之委托再理解(delegate的构造器,MulticastDelegate,BeginInvoke,EndInvoke,Invoke4个方法的探讨)...
- LinkCloud谈云主机与主机托管主机租用的区别
- Android 身高计算
- 苏菲的世界-part2
- Spring框架整合Java Web Token
- cms漏洞复现-越权漏洞
热门文章
- WPF MVVM实例三
- .NET6之MiniAPI(五):选项
- 如何摆脱「自我否定」状态
- 在VS Code中直接调试Web程序,是怎样一种体验?
- .NET Core3.1升级.NET5,坑还真不少...
- 设计模式中的那些工厂
- 基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档(上篇)
- EFCore.Sharding(EFCore开源分表框架)
- .NET Core开发实战(第11课:文件配置提供程序)--学习笔记
- EF Core For MySql查询中使用DateTime.Now作为查询条件的一个小问题