分享好友 最新动态首页 最新动态分类 切换频道
java核心知识之集合详解五(Map集合和Collections工具类)
2024-12-26 23:57

Map 用于保存具有关系的数据,因此Map集合里保存着两组值 ,一组值用于保存 Map 里的 key ,另外一组值用于保存 Map 里的 value , 。 ,即同一个 Map 对象的任何两个 key 通过 equals 方法比较总是返回 false 。

java核心知识之集合详解五(Map集合和Collections工具类)

Map集合常用的API方法

 

示例代码

 
 

Entry内部类

Map 中包括一个内部类 Entry,该类封装了 一个 key-value 对。 Entry 包含如下三个方法 。

Object getKey(): 返回该 En町里包含的 key 值 。
Object getValue(): 返回该 Entry 里包含的value 值 。
Object setValue(V value): 设置该 Entry 里包含的 value 值,并返回新设置的 value 值 。

Map集合新增的API的方法

1、Object compute(Object key, BiFunction remappingFunction): 该方法使用remappingFunction 根据 原 key-value 对计算一个新 value 。 只要新 value 不为 null,就使用新value 覆盖原 value; 如果原 value 不为 null,但新 value 为 null ,则删除原 key-value对;如果原 value 、新 value 同时为 null , 那么该方法不改变任何 key-value 对,直接返回 null 。

2、Object computeIfAbsent(Object key, Function mappingFunction):如果传给该方法的 key 参数在 Map 中对应的 value 为 null ,则使用 mappingFunction 根据 key计算一个新的结果,如果计算结 果不为 null,则用计算结果覆盖原有的 value 。 如果原 Map 原来不包括该 key,那么该方法可能会添加一组 key-value 对 。

3、Object computeIfPresent(Object key, BiFunction remappingFunction):如果传给该方法的 key 参数 在 Map 中对应的 value 不为 null,该方法将使用 remappingFunction 根据原key、 value 计算一个 新的结果,如果计算结果不为 null,则使用该结果覆盖原来的 value; 如果计算结果为 null,则删除原 key-value 对 。

4、void forEach(BiConsumer action): 该方法是 Java 8 为 Map 新增的一个遍历 key-value 对的方法,通过该方法可以更简洁地遍历 Map 的 key-value 对 。

5、Object getOrDefault(Object key, V defaultValue): 获取指定 key 对应的 value 。 如果该 key 不存在,则返回 defaultValue。

6、Object merge(Object key, Object value, BiFunction remappingFunction): 该方法会先根据 key 参数获取该 Map 中对应的 value 。 如果获取的 value 为 null,则直接用传入的 value 覆盖原有的 value (在这种情况下,可能要添加一组 key-value 对 ) ;如果获取的value 不为 null ,则使用remappingFunction 函数根据原 value 、新 value 计算一个新的结果,并用得到的结果去覆盖原有 的 value 。

7、Object putlfAbsent(Object key, Object value): 该方法会自动检测指定 key 对应的value 是否为 null,如果该 key 对应的 value 为 null,该方法将会用新 value 代替原来的 null 值 。

8、Object replace(Object key, Object value): 将 Map 中指定 key 对应的 value替换成新 value 。与传统put()方法不同的是,该方法不可能添加新的 key-value 对 。 如果尝试替换的 key 在原 Map 中不存在,该方法不会添加 key-value 对,而是返回 null 。

9、boolean replace(K key, V oldValue, V newValue): 将 Map 中指定 key-value对的原 value 替换成新value 。如果在 Map 中找到指定的 key-value 对,则执行替换并返回 true ,否则返回false 。

10、replaceAll(BiFunction function): 该方法使用 BiFunction 对原 key-value 对执行计算,并将计算结果作为该 key-value 对的 value 值 。

基本原理

LinkedHashMap 使用来维护 的次序(其实只需要考虑 key 的次序) ,该链表负责维护 Map 的迭代顺序,迭代顺序与 key-value 对的插入顺序保持一致。
LinkedHashMap 可以避免对 HashMap 、 Hashtable 里 的 key-value 对进行排序(只要插入 key-value对时保持顺序即可),同时又可避免使用 TreeMap 所增加的成本 。LinkedHashMap 需要,因此但因为它以链表来维护内部顺序,所以在迭代访问 Map 里的全部元素时将有较好的性能 。

实例代码

 
 
 

基本原理

SortMap接口有一个TreeMap实现类,TreeMap 就是 一个红黑树数据结构 , 每个 key-value 对即作为红黑树的一个节点 。 TreeMap 存储key-value 对(节点)时, 需要根据 key 对节点进行排序。 TreeMap 可以保证所有的 key-value 对处于有序状态。 TreeMap 也有两种排序方式。

1、自然排序 TreeMap实现类的所有Key必须要实现Comparable接口,而且所有的key必须要是同一个类对象的,否则会抛出ClassCastException.
2、定制排序 创建 TreeMap 时,传入一个 Comparator 对象, 该对象负责对 TreeMap 中的所有key 进行排序 。采用定制排序时不要求 Map的 key 实现 Comparable 接口。

TreeMap中判断两个key相等的方法是两个key通过compareTo()方法返回0, 如果使用自定义类作为TreeMap实现类的key时,应当重写equals()方法和compareTo()方法,使得两个方法的返回结果一致。

TreeMap实现类提供一系列的访问Key-Value方法如下

 

实例代码

 
 
 

基本原理

WeakHashMap 与 HashMap 的用法基本相似 。 与 HashMap 的 区别在于,HashMap 的 key 保留了对实际对象的,这意味着只要该 ,该 ,HashMap 也不会自动删除这些 key 所对应的 key-value 对 ;但 WeakHashMap 的 key只保留了对实际对象的弱引用,这意味着如果 WeakHashMap 对象的 key 所引用的对象没有被其他强引用变量所引用,则这些 key 所引用的对象可能被垃圾回收, WeakHashMap 也可能自动删除这些 key 所对应的 key-value 对 。

实例源码

 
 
 

基本原理

IdentityHashMap 实现类的实现机制与 HashMap 基本相似,但它在处理两个 key 相等时比较独特:在IdentityHashMap 中,当且仅当 两个 key 严格相等 (key1 == key2) 时, IdentityHashMap 才认为两个 key相等;对于普通的 HashMap 而言,只要 key1 和 key2 通过 equals()方法比较返回 true ,且它们的 hashCode值相等即可 。

实例源码

 
 
 

基本原理

EnumMap 是一个与枚举类一起使用的 Map实现, EnumMap 中的所有 key 都必须是单个枚举类的枚举值 。 创建 EnumMap 时必须显式或隐式指定它对应的枚举类。 EnumMap 具有如下特征 。

1、EnumMap在内部以数组形式保存,所以这种实现形式非常紧凑、高效 。
2、EnumMap 根据 key 的自然顺序(即枚举值在枚举类中的 定义顺序〉来维护 key-value 对的顺序 ,当程序通过 keySet()、 entrySet() 、 values()等方法遍历EnumMap 时可以看到这种顺序 。
3、EnumMap 不允许使用 null 作为 key ,但允许使用 null 作为 value 。如果试图使用 null 作为 key时将抛出 NullPointerException 异常 。 如果只是查询是否包含值为 null 的key,或只是删除值为null 的key ,都不会抛出异常 。

与创建普通的 Map 有所区别的是,创建 EnumMap 时必须指定一个枚举类,从而将该 EnurnMap 和
指定枚举类关联起来 。

实例源码

 
 
 

对于 Map 的常用实现类而言,虽然 HashMap 和 Hashtable 的实现机制几乎一样,但由于 Hashtable
是一个古老的、线程安全的集合,因此 HashMap 通常比 Hashtable 要快 。

TreeMap 通常比 HashMap 、 Hashtable 要慢( 尤其在插入、删除 key-value 对时更慢),TreeMap
底层采用红黑树来管理 key-value 对(红黑树的每个节点就是一个 key-value 对) 。

使用 TreeMap 有一个好处::TreeMap 中的 key-value 对总是处于有序状态 ,无须专 门进行排序操作 。当 TreeMap 被填充之后,就可以调用 keySet,取得由 key 组成的 Set,然后使用 toArray()方法生成 key的数组,接下来使用Arrays 的 binarySearch()方法在己排序的数组中快速地查询对象。

对于 一般的应用场景 , 程序应该多考虑使用 HashMap ,因为 HashMap 正是为快速查询设计的(HashMap 底层其实也是采用数组来存储 key-value 对 〉 。 但如果程序需要一个总是排好序的 Map 时,则可以考虑使用 TreeMap 。

LinkedHashMap 比 HashMap 慢一 点,因为它需要维护链表来保持 Map 中 key-value 时的添加顺序。IdentityHashMap 性能没有特别出色之处 ,因为它采用与 HashMap 基本相似的实现 , 只是它使用 == 而不是 equals()方法来判断元素相等 。 EnumMap 的性能最好 ,但它只能使用同一个枚举类的枚举值作为 key 。

Collections 提供了如下常用的类方法用于对 List 集合元素进行排序 。

 
 

Collection s 还提供了如下常用的用于查找 、 替换集合元素的类万法 。

最新文章
第十一章 文件操作_C语言插入、删除、更改文件内容
我们平时所见的文件,例如 txt、doc、mp4 等,文件内容是按照从头到尾的顺序依次存储在磁盘上的,就像排起一条长长的队伍,称为顺序文件。 除了顺序文件,还有索引文件、散列文件等,一般用于特殊领域
微信小程序开发多少钱一个月
在当今互联网飞速发展的时代,微信小程序因其便捷、功能多样和用户量庞大,成为众多企业、商家乃至个体创业者拓展线上业务的重要工具。对于想要开发微信小程序的企业而言,最关心的问题之一就是费用问题。在合肥开发一款微信小程序的费用到
淘宝关键词排名优化怎么做?影响因素有哪些?
标题是淘宝店铺自然搜索流量最重要的入口,如果宝贝的标题没有做好,那么后续的运营也就没有什么意义了。想要获取自然搜索流量,那么标题的关键词就得有权重,有排名。一、淘宝标题关键词如何优化靠前?首先,搜索引擎会先抓取大热词,大热
转:Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
https://www.cnblogs.com/52xf/p/4209211.html    附上表结构和初始数据图:用法: 一:语法(用法):      rank() over([partition by col1] order by col2)      dense_rank() over([partition by col
苹果手机请启用javascript,请启用javascript教程
JavaScript是一种广泛应用于网页开发的脚本语言,它为网页增加了交互性和动态功能。如果您想在手机上开发和运行JavaScript代码,您需要确保手机浏览器支持JavaScript并已启用该功能Deepl降重。下面是一些简单的步骤,帮
美国男篮历史上有哪些巨星
1、迈克尔·乔丹迈克尔·乔丹,全球最具影响力的篮球运动员,也是世界上最伟大的篮球运动员,球迷们送了他一个外号“篮球之神”,可见乔丹在篮球运动中的影响力。曾在1984年和1992年两次带队参加奥运会,最终两次均以全胜战绩夺取金牌。2、
竞价推广之SEMer如何快速做好竞争对手分析?
俗话说,知己知彼百战不殆。且它在一定程度上决定了我们的推广策略以及账户优化方向。那么,小编想问你:对于你的竞争对手,你了解多少?日常你又会针对竞争对手做哪些分析?我想对于大多数人来说,都是一时兴起点击一下广告,并没有一定的目
赵丽颖黑粉的行为,深度分析与反思_反馈记录和整理
摘要:本文关注赵丽颖黑粉的行为,对其进行了深度分析与反জ
相关文章
推荐文章
发表评论
0评