【总结】Java基础之Map:HashMap vs. LinkedHashMap vs. TreeMap vs. ConcurrentHashMap

Map是Java最常用的集合类之一。它有很多实现类,我总结了几种常用的Map实现类,如下图所示。本篇文章重点总结几个Map实现类的特点和区别:

[img]http://dl.iteye.com/upload/picture/pic/135005/4ed4763b-ff80-3ae7-b2bc-bd5967a39368.png[/img]

特点总结:
[table]
|实现类|HashMap|LinkedHashMap|TreeMap|Hashtable|ConcurrentHashMap|
|允许key/value为空|允许为空|允许为空|允许为空|不允许为空|不允许为空|
|线程安全|不安全|不安全|不安全|安全(全部锁)|安全(部分锁)|
|排序|无序|迭代器顺序|红黑树顺序(可以自定义)|无序|无序|
[/table]

[color=blue][b]1、HashMap: Map最常用的实现类[/b][/color]
[b]a、HashMap可以存空的key和空的value。[/b]

public void nullKeyTest() {
Map<String, Object> map = new HashMap<String, Object>();
map.put(null, "value");
System.out.println(map); // {null=value}
}


public void nullValueTest() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("key", null);
System.out.println(map); // {key=null}
}

[b]b、HashMap线程不安全,在多线程的情况下,需要额外方法实现数据的同步。Collections提供了同步的方法,如下:返回了一个线程安全的HashMap类。[/b](PS:这时候可以考虑ConcurrentHashMap,下文有介绍)。

public void synchMapTest() {
Map<String,Object> map = Collections.synchronizedMap(new HashMap<String,Object>());
// returned a synchoronized HashMap
}


[color=blue][b]2、LinkedHashMap: HashMap子类[/b][/color]
[b]a、LinkedHashMap作为HashMap的子类,同样也可以存空的key和空的value。[/b]

[b]b、LinkedHashMap会按存入顺序存放元素(迭代器顺序)。[/b]
现实中很多情况下都可以使用LinkedHashMap,例如购物车的实现:按用户添加的时间顺序显示购物车中的元素。
以下map的输出是有顺序的,而map1是无序的。

public void iterateOrderTest() {
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("ccc", "value");
map.put("bbb", "value");
map.put("aaa", "value");
System.out.println(map); // {ccc=value, bbb=value, aaa=value}

Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("ccc", "value");
map1.put("bbb", "value");
map1.put("aaa", "value");
System.out.println(map1); // {aaa=value, ccc=value, bbb=value}
}


[b]c、LinkedHashMap有个方法叫:removeEldestEntry(Map.Entry) ,用户可以重写该方法来制定添加元素时的策略。方法内部返回true时,当要往该map中存放(put\putAll)元素时,就先删除最老的对象,然后再添加新对象。[/b]使用实例:在设计Cache(缓存)时,可以重写该方法来制定键值的过期规则。
API:[url]http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html#removeEldestEntry(java.util.Map.Entry)[/url]
例子:在新建一个LinkedHashMap对象时,重写了其removeEldestEntry方法,如果map的容易大于2时,就返回true,于是最老的键aaa就被删除了。

public void removeEldestEntryTest() {
Map<String, Object> map = new LinkedHashMap<String, Object>() {
private int MAX_ENTRIES = 2;
protected boolean removeEldestEntry(Map.Entry<String, Object> eldest) {
return size() > MAX_ENTRIES;
}
};

map.put("aaa", "value");
map.put("bbb", "value");
map.put("ccc", "value");
System.out.println(map); // {bbb=value, ccc=value}
}


所以如果不是为了键值的顺序,还是使用HashMap最好,因为LinkedHashMap需要额外的空间去维护键值之间的链表关系。

[color=blue][b]3、Hashtable类[/b][/color]
Hashtable是JDK1.0就有的,算是很古老的Map实现了,前辈们设计的初衷就是为了线程安全考虑的(有点类似List里的一个实现类,叫Vector)。
另外就是Hashtable不能存放空的key/value,会报java.lang.NullPointerException错误。
值得一提的是,现在很少会用到Hashtable类,如果要在多线程的情况下使用线程安全类,那会考虑ConcurrentHashMap,下文有介绍。

[color=blue][b]4、SortedMap的实现类:TreeMap[/b][/color]
TreeMap红黑树的一个实现。其键值按照自然顺序排序的。它的构造函数中提供了参数Comparator,可以自定义实现排序。
另外,TreeMap也是线程不安全的。

构造器API:

TreeMap(Comparator<? super K> comparator)
// 返回一个空的tree map,按传入的comparator规则进行排序。

排序的例子:

public void orderTest() {
Map<String, String> treeMap = new TreeMap<String, String>();
treeMap.put("aaa", "value1");
treeMap.put("bbb", "value2");
treeMap.put("ccc", "value3");
System.out.println(treeMap); // {aaa=value1, bbb=value2, ccc=value3}
}

// 自定义排序器:按键值的倒序排序:
public void comparatorTest() {
Map<String,String> treeMap1 = new TreeMap<String,String>(new Comparator<String>(){
public int compare(String o1, String o2) {
return -o1.compareTo(o2);
}
});
treeMap1.put("aaa", "value1");
treeMap1.put("bbb", "value2");
treeMap1.put("ccc", "value3");
System.out.println(treeMap1); // {ccc=value3, bbb=value2, aaa=value1}
}


[color=blue][b]5、ConcurrentMap的实现类:ConcurrentHashMap[/b][/color]
ConcurrentHashMap是1.5版本引进的。Concurrent的意思是同时发生的,所以这个实现类的重点是线程安全。(有点类似于Hashtable,但也有区别)。
ConcurrentHashMap的默认并发级别是16。
ConcurrentHashMap的设计初衷是优化线程安全中的读操作,ConcurrentHashMap在取元素的操作(包括get)通常没有加锁,而对于另外一个线程安全的Hashtable来说,是所有方法都加同步锁的。
一般来说,在JAVA1.5版本以后,推荐使用的是ConcurrentHashMap,而Hashtable有点像是历史遗留的类而已。

以下是国外的一篇文章中摘录的ConcurrentHashMap和Hashtable的性能对比:
[table]
|Threads|ConcurrentHashMap|Hashtable|
|1| 1.00|1.03|
|2| 2.59|32.40|
|4| 5.58|78.23|
|8| 13.21|163.48|
|16| 27.58|341.21|
|32|57.27|778.41|
[/table]

-------------------------------------------
参考:
1、JDK API doc online: [url]http://docs.oracle.com/javase/6/docs/api/java/util/Map.html[/url]
2、ConcurrentHashMap and CopyOnWriteArrayList offer thread safety and improved scalability[url]http://www.ibm.com/developerworks/java/library/j-jtp07233/index.html[/url]
LinkedHashMap与HashMap深度对比:从原理到LRU缓存实战 在Java集合框架中,哈希表是实现高效键值对存储的核心数据结构。其基本原理是通过哈希函数将键映射到数组索引,从而实现接近O(1)时间复杂度的查找操作。然而,标准哈希表(如HashMap)不维护元素的插入或访问顺序,这在需要保持元素顺序或实现特定淘汰策略(如LRU缓存)的场景中存在局限。为了解决这一问题,LinkedHashMap在继承HashMap哈希表结构的基础上,通过维护一个贯穿所有节点的双向链表,巧妙地记录了元素的顺序。这一设计使其在保持高效查找的同时,能够以O(1)成本维护两种顺序模式:插入顺序和访 阅读详情

相关推荐

Java集合框架:Map核心实现与性能优化指南

Map作为Java集合框架中的核心数据结构,采用键值对存储机制实现高效数据访问。其底层通常基于哈希表实现,通过哈希函数将键映射到存储位置,实现O(1)时间复杂度的快速查找。这种特性使Map成为构建缓存系统、实现快速检索的理想选择。在实际工程中,HashMap通过数组+链表+红黑树的混合结构平衡了空间与时间效率,而ConcurrentHashMap则采用CAS+synchronized机制保证线程安全。合理设置初始容量和负载因子能有效避免rehash带来的性能损耗,对于高频访问场景,LinkedHashMap

weixin_31960565的博客 295

java中map与hashmap的区别

在java中,map和hashmap两者都是键值对的集合,存储的元素都是无序的,和插入的顺序无关。但是,map是一个接口,而hashmap是实现了map接口的类,根据键的HashCode值来存储数据,访问速度快,不支持线程同步。

程序星空实验室 1757

java基础 数据结构

✅数组快但不灵活,集合灵活但有成本。

a378113472的博客 476

java中Map 和 HashMap 的区别

java中Map 和 HashMap 的区别

独断万码 4830

Java集合容器面试题(2026版)

序列号 内容 链接 1 Java基础知识面试题(2022版) https://blog.csdn.net/qq_43061290/article/details/124023797 2 Java集合容器面试题(2022版) 待续… https://editor.csdn.net/md?spm=1001.2101.3001.5352&articleId=124043363 3 Java异常面试题(2022版) 待续… 4 并发编程面试题 (2022版) 待续… 5 JV....

拉格朗日的学习笔记 1万+

嵌入式系统启动流程解析:ROM Code、Bootloader与启动代码的协同工作

本文深入解析嵌入式系统从通电到运行的完整启动流程,详细阐述了ROM Code、Bootloader与启动代码三者如何像接力赛般协同工作。ROM Code作为芯片固化的初始引导程序,负责硬件自检并加载Bootloader;Bootloader作为系统总指挥,初始化关键硬件并加载操作系统内核;启动代码则为C语言运行环境铺平道路。理解这三者的分工与协作,是进行系统移植和解决启动问题的关键。

dd012的博客 553

Java基础之HashMap(和其他Map的区别)

1. 继承关系 2. 基础属性 DEFAULT_INITIAL_CAPACITY = 1 << 4 默认初始化大小16,构造方法可设置,设置值为传入参数的最小的2的幂次方的数值,就比如你传值为20,则HashMap的大小为32(2的5次方),传值为10,则大小为16 MAXIMUM_CAPACITY = 1 << 30 最大容量2的30次方,int的最大正数值 DEFA...

小智的装逼时间 836

如何浏览与下载全球免费的地图高分辨率(亚米级)的遥感影像?

前言 如果你想使用商业卫星的高分辨遥感影像,一般价格昂贵。我们可以使用地图平台上免费的高分辨率数据。目前数据源很多,比如说google earth、天地图、四维地球、必应地图等等。这些影像统一有一个共同点就是:RGB三波段;Web地图瓦片服务。这意味着我们可以通过瓦片服务下载影像,但下载的影像只有三个波段,分别是 一.引言 二、可使用高分辨率的地图数据源 1.Google Earth影像 2.Esri World Image 3.天地图 4.必...

锐多宝的地理空间 2万+

Java中Map接口HashMap与HashTable的区别及HashMap深入理解

HashMap和HashTable都完成了Map接口,实际上HashMap是HashTable轻量级实现(非线程安全的实现),对比于ArrayList和Vector的区别: HashMap和ArrayList都是线程不同步的,即多线程不安全的,但只有一个线程访问时效率相比于另一个要高; HashTable和Vector都是线程同步的,即多线程安全,但相比于上面两个访问效率较低。 Ha

行者小朱的博客 1万+

ndnSIM学习笔记(一)

在接下来的一段时间要用ndnSIM来做自己的仿真网络,需要系统的学习相关内容,以下为内容记录。1.安装      1.1核心依赖(必需的)             • python &gt;= 2.6             • libsqlite3             • libcrypto++             • pkg-config             • Boost lib...

gaonjzzz的博客 2985

基于STM32的多模态智能风扇控制系统设计与实现

本文详细介绍了基于STM32单片机的多模态智能风扇控制系统的设计与实现。系统集成了红外遥控、蓝牙手机控制及人体感应等多模态交互方式,通过PWM技术实现无级调速,并设计了安全优先的控制逻辑。文章从硬件选型、核心原理、软件编程到系统调试,提供了完整的实战指南,适合嵌入式开发爱好者学习与实践。

weixin_28285943的博客 238

HashTable和HashMap区别

HashMap和Hashtable两个类都实现了Map接口,二者保存K-V对(key-value对);HashSet则实现了Set接口,性质类似于集合。 HashTable和HashMap区别 第一,继承的父类不同。 Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。 [java]view p...

b1147755的博客 355

MicroPython学习:在STM32上进行移植

本文将介绍如何在STM32上移植MicroPython,并提供相应的源代码。通过以上步骤,你已经成功地将MicroPython移植到STM32上,并可以使用MicroPython语言编写和运行代码。你可以进一步探索MicroPython的功能和API,以利用STM32的各种外设和功能。使用STM32CubeProgrammer或其他适当的烧录工具,将编译生成的MicroPython固件烧录到STM32微控制器中。打开该文件,并根据你的STM32微控制器类型进行必要的配置更改。模块来控制STM32的LED。

JeeVue的博客 1237

25Map(LinkedHashMap、Hashtable、ConcurrentHashMap、TreeMap)、内置比较器、外置比较器、Properties、Collections

存入null键:应用场景:HashMap:无序 + 去重LinkedHashMap:有序+去重Hashtable:无序 + 去重 + 线程安全(方法里加锁,效率低,已弃用)ConcurrentHashMap:无序+去重+线程安全(局部加锁+CAS,效率高,推荐使用)5.TreeMap(内置比较器、外置比较器;比较器接口day24介绍全)6.Properties – 配置文件类7.Collections – 集合的工具类。

gangain的博客 903

5G/NR 网络切片基本概念(协议版)

26.1 网络切片概念 网络切片是一个概念,可以根据每个客户的要求进行区别对待。通过切片的形式,将不同流量差异化处理,以及可以将资源进行隔离,然后移动网络运营商可以将客户视为属于不同租户类型的客户,每种客户具有不同的服务要求,这些要求根据每个租户根据SLA (Service Level Agreement,服务水平协议)可以使用哪种切片类型进行管理和订阅。 网络切片始终由RAN部分和CN部...

欢迎来到小七的博客,这里将带你深入探索5G通信的神秘世界。无论你是通信领域的专业人士还是对这一领域充满好奇心的技术爱好者,这里都有专业协议解读、通信知识普及以及有趣的Python编程内容等你发现。 1万+

Dify 第 2 篇 Dify 插件离线安装

Dify是一个支持插件扩展的AI平台,其插件市场提供5种类型插件(模型、工具、Agent策略、扩展、插件包)。由于默认pip安装速度慢,可通过dify-plugin-repackaging工具将插件转换为离线包(使用阿里云镜像加速)。该工具提供两种方式:1)自备Python环境执行脚本;2)使用Docker环境(推荐)。脚本支持从Dify市场或GitHub下载插件,并重新打包为含依赖的离线包,便于通过"本地插件"方式快速安装。

甘蓝的专栏 1258

Java Map与HashMap核心差异解析:从接口设计到哈希表实现

在计算机科学中,数据结构是组织和存储数据的基础,而映射(Map)作为一种关键的抽象数据类型,定义了键值对(Key-Value Pair)的存储与访问契约。其核心原理在于通过键快速定位值,这通常借助哈希表(Hash Table)机制实现,以达到接近O(1)的理想时间复杂度。这项技术的核心价值在于提供了高效的数据检索能力,是构建缓存、索引和配置系统的基石。在实际工程中,不同的具体实现如HashMap、TreeMap和ConcurrentHashMap,分别针对无序高速存取、有序遍历和高并发场景进行了优化。理解哈

weixin_34293141的博客 523

Android 10.0 任务栏音乐播放器后台播放杀进程功能实现

在10.0的系统rom定制化开发过程中,在某些情况下在安装第三方播放器以后,播放音乐的时候,在最近任务栏recents列表中,点击全部清除,发现音乐播放器还在播放音乐,导致出现bug,完整的 解决方法,肯定是需要点击全部清除以后,音乐播放器也被杀掉进程,接下来看下这个问题怎么解决

安卓兼职framework和app工程师的博客 650

Java 集合框架(Map 体系)深度解析:从原理到实战

未来,随着 Java 生态的持续演进,Map 体系将继续在高性能、高可用场景中扮演核心角色。实现,其核心思想是通过哈希函数将键(Key)映射到数组的特定位置,从而实现快速访问。等技术的推进,Java 集合框架正朝着更细粒度的并发控制和更低延迟的方向发展。的核心接口,其设计目标是提供一种基于键的快速查找、插入和删除能力。,通过维护一条双向链表记录键值对的插入顺序(或访问顺序),从而实现。点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】,通过键(Key)而非索引直接访问值(Value)。

like21a的博客 1145

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java集合

1. Hashtable和HashMap的区别: (1).都实现了Map接口,Hashtable是Dictionary的子类,HashMap是AbstractMap的子类; (2).Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。

884

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LinkedHashMap与TreeMap深度对比:有序Map选型指南与性能实战

在Java集合框架中,Map是存储键值对的核心数据结构,其哈希表实现提供了高效的O(1)查询。然而,当业务需要维护元素的特定顺序时,就需选用有序Map。LinkedHashMap通过在哈希表基础上附加双向链表,以极低成本维护元素的插入或访问次序,适用于LRU缓存等场景。TreeMap则基于红黑树实现,保证键的排序顺序,支持高效的范围查询,但操作复杂度为O(log n)。理解两者的底层原理与性能差异,对于实现高性能缓存、构建有序数据视图等工程实践至关重要。本文通过实战案例,深入解析LinkedHashMap和

weixin_30785593的博客 375

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java集合容器核心原理与面试实战:从HashMap到ConcurrentHashMap

Java集合框架是每个开发者绕不开的基础知识,它封装了数组、链表、哈希表等经典数据结构,并提供了统一的接口与多种实现。理解集合的底层设计原理,如HashMap的数组+链表+红黑树结构、扩容机制以及哈希扰动函数,不仅能应对面试中的高频问题,更能指导实际工程中的容器选型与性能优化。从单线程的ArrayList到并发场景下的ConcurrentHashMap,集合框架体现了空间与时间、安全与性能之间的精妙权衡。掌握这些容器的工作原理,还能有效避免遍历修改异常、内存泄漏等常见陷阱。本文系统梳理了Java集合容器从整

weixin_33795093的博客 463

HashMap与LinkedHashMap深度解析:从数据结构到LRU缓存实现

在Java集合框架中,哈希表是实现高效键值对存储的核心数据结构,它通过哈希函数将键映射到数组索引,实现O(1)时间复杂度的快速查找。然而,标准哈希表不保证元素的遍历顺序,这在需要维护插入或访问时序的场景中成为限制。LinkedHashMap在继承HashMap哈希表结构的基础上,通过维护一个贯穿所有节点的双向链表,提供了可预测的迭代顺序,支持插入顺序或访问顺序两种模式。这一特性在需要记录操作序列、保持配置顺序或实现缓存淘汰策略时具有重要技术价值。特别是在构建LRU(最近最少使用)缓存时,LinkedHash

weixin_33895516的博客 574

Java Map常用方法和实现类深度详解

Map 是 Java 集合框架中用于存储键值对(Key-Value)的接口,键不可重复,值可重复。核心实现类包括HashMapTreeMap和Hashtable。

weixin_49991516的博客 342

Java中Map与Set的核心原理与性能优化实践

Map和Set是Java集合框架中的两种基础数据结构,分别基于哈希表和红黑树实现。Map通过键值对存储实现快速查找,时间复杂度可达O(1);Set则确保元素唯一性。在实际工程中,合理选择初始容量和负载因子能显著提升HashMap性能,而TreeMap则适合需要排序的场景。多线程环境下,ConcurrentHashMap通过分段锁技术保证线程安全。这些数据结构广泛应用于缓存系统、数据去重、集合运算等场景,是Java开发者必须掌握的核心技术。本文通过源码分析和性能测试,深入探讨HashMap、TreeMap等实

weixin_30861797的博客 327

一文认识Java常见集合

摘要: Java集合框架提供动态存储对象的解决方案,核心分为Collection(List/Set/Queue)和Map两大分支。常用实现类包括ArrayList(动态数组,查询高效)、LinkedList(链表,增删高效)、HashSet(哈希去重)、HashMap(键值对存储)等。选择依据: List:ArrayList适合随机访问,LinkedList适合频繁头尾操作 Set:HashSet通用去重,TreeSet需排序 Map:HashMap常用,LinkedHashMap保持顺序,TreeMap按

likuoelie的博客 519
上一篇: 【总结】正则表达式
下一篇: 【总结】Java基础之List:ArrayList vs. LinkedList vs. Vector
angelbill3
博客等级 码龄18年 3粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值