map 的介绍 java_【Java基础】Map的介绍

前三篇讲解了Java容器中的List和Set

可以看出,Set接口的具体实现类都是通过Map接口的实现类来实现的,现在我们来讲一讲Map接口,因为已经有前三篇文章作为基础了,Map接口我将只用这一篇文章进行入门。

1. UML

老规矩,先看UML关系图

e49243adc1b7e38ed58a65860da30270.png

2. 通过注释学习

同样的,经过前面三篇文章的铺垫了,我从这篇文章开始,我就不把源码、注释复制粘贴了,我们多做一些需要思考、实践的工作,少做一些搬运工

2.1 Map接口

Map界面提供了三个集合视图,一组键,一组值或一组键-值映射。(就是你可以那这个Map的实现类做键值对的容器,或者你把他当作集合来用也可以)

一些Map实现对其顺序做出特定的保证(例如TreeMap类)。其他的则没有(例如HashMap类)。

2.2 AbstractMap抽象类

此类提供Map接口的基本实现,以最大程度地减少实现此接口所需的工作。

程序员通常应按照Map接口规范中的建议提供一个void(无参数)和map构造函数。

此类中每个非抽象方法的文档都详细描述了其实现。

2.3 HashMap

基于哈希表的Map接口实现类。此实现提供所有可选的映射操作,并允许空值和空键。 (HashMap类与Hashtable大致等效,不同之处在于它是不同步的,并且允许为null。)该类不保证映射的顺序。甚至,它不能保证顺序会随着时间的推移保持恒定。

HashMap的实例具有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中存储桶的数量,初始容量只是创建哈希表时的容量。负载因子是在自动增加其哈希表容量之前允许哈希表获得的满度的度量。当哈希表中的条目数超过负载因子和当前容量的乘积时,哈希表将被重新哈希(即,内部数据结构将被重建),因此哈希表的存储桶数大约为两倍。通常,默认负载因子(0.75)在时间和空间成本之间提供了一个很好的折衷方案。较高的值会减少空间开销,但会增加查找成本(在HashMap类的大多数操作中都得到体现,包括get和put)。设置映射表的初始容量时,应考虑映射中的预期条目数及其负载因子,以最大程度地减少重新哈希操作的数量。如果初始容量大于最大条目数除以负载因子,则将不会进行任何哈希操作。

如果要将许多映射存储在HashMap实例中,则创建具有足够大容量的映射将比使它根据需要增长表的自动重新哈希处理更有效地存储映射。

未实现线程同步。

2.4 TreeMap

基于红黑树的Map接口实现类。根据映射键的自然顺序或在映射创建时提供的Comparator对映射进行排序,具体取决于所使用的构造函数。

如果TreeMap要正确实现Map接口,则TreeMap所维护的排序(与任何排序的映射一样)以及是否提供显式比较器必须与equals一致。(有关与equals一致的精确定义,请参见Comparable或Comparator。)之所以这样,是因为Map接口是根据equals操作定义的,但是排序后的map使用其compareTo(或compare)方法执行所有键比较,因此两个从已排序映射的角度来看,此方法认为相等的键是相等的。排序后的映射的行为是明确定义的,即使其排序与equals不一致也是如此;它只是不遵守Map接口的一般约定。

未实现线程同步。

2.5 LinkedHashMap

基于哈希表和链表的Map接口实现类,具有可预测的迭代顺序。

此实现与HashMap的不同之处在于,它维护贯穿其所有条目的双向链接列表。此链表定义了迭代顺序,通常是将键插入映射的顺序(插入顺序)。请注意,如果将密钥重新插入到映射中,则插入顺序不会受到影响。

此实现使用户免于HashMap(和Hashtable)提供的未指定的混乱的排序,同时不会增加与TreeMap相关的成本。

链接的哈希映射具有两个影响其性能的参数:初始容量和负载因子。它们的定义与HashMap一样。但是请注意,与HashMap相比,此类为初始容量选择过高的值的惩罚不那么严重,因为此类的迭代时间不受容量的影响。

此类提供所有可选的Map操作,并允许空元素。像HashMap一样,它假定基本功能(添加,包含和删除)可提供恒定时间的性能,并假定哈希函数将元素正确地分布在存储桶中。由于维护链表的额外费用,性能可能会略低于HashMap,但有一个例外:对LinkedHashMap的集合视图进行迭代需要的时间与地图的大小成正比,而无论其容量如何。在HashMap上进行迭代可能会更昂贵,需要的时间与其容量成正比。

未实现线程同步。

3. 关系对比

存储结构

HashMap基于哈希表

TreeMap基于二叉树

LinkedHashMap基于哈希表,并且引入了双向链表

线程安全

都不具备线程安全机制,需要手动显式添加

扩容机制

HashMap有两个参数,初始容量和负载因子。容量是哈希表中存储桶的数量,初始容量只是创建哈希表时的容量。负载因子是在自动增加其哈希表容量之前允许哈希表获得的满度的度量。然后他有个阈值(阈值 = 容量 * 负载因子),然后当Map中的元素数量大于或等于阈值,且元素将会被放置在一个非空的存储桶上,这时候就会触发扩容机制,将容量扩大为两倍。

TreeMap基于二叉树,容量方面没有限制

LinkedHashMap是哈希表加双向链,实质上的扩容机制与HashMap相同。

基本方法

三个类都继承自AbstractMap抽象类,并且都实现了Map接口,所以有一样的增删改查方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值