JCF的Set集合

愿天堂没有BUG

共 1573字,需浏览 4分钟

 · 2022-12-18

Set集合中不存在值相同的节点,相信各位读者都知道如何判断两个对象是否相同:将这两个对象分别记为e1和e2,如果"e1.equals(e2)"的结果为true,或者e1对象和e2对象的内存地址相同(e1==e2),就认为这两个对象相同。

这个标准也是Map集合中判定两个Key键对象是否相同的标准。这实际上可以解释为什么JCF中的多个原生Set集合,其内部结构都依赖于对应的Map集合的内部结构。

本书在介绍Set集合前,先介绍了JCF中的多个原生Map集合,也主要是这个原因。例如,本书后面要介绍的HashSet集合,其内部主要依赖于HashMap集合的内部结构;后面要介绍的TreeSet集合,其内部结构主要依赖于HashMap集合的内部结构,如图4-1所示

为了方便读者阅读,这里再次给出HashMap集合中判定Key键对象是否一致的源码片段:

Set集合概述

因为JCF中各种原生Set集合的内部结构都依赖于对应的Map集合进行实现,而JCF中重要的原生Map集合已在第3章中进行了详细介绍,所以本章内容相对精简,实际上是在Map集合的工作原理之上做一些知识点补充。在介绍具体的Set集合前,需要介绍一下Set集合中几个重要的接口和抽象类:java.util.SortedSet口 、java.util.NavigableSet口 和java.util.AbstractSet抽象类。

java.util.SortedSet接口

在一般情况下,Set集合中的数据对象是无序的。例如,在HashSet集合中,可以使用add()方法添加多个数据对象,这些数据对象在HashSet集合中的位置顺序会受添加顺序的影响,示例代码如下。

出现这样的情况,是由HashSet集合的内部结构决定的——HashSet集合的内部结构和HashMap集合的内部结构相同。如果某个具体的Set集合实现了java.util.SortedSet接口,就表示该集合中的数据对象会按照某种比较方法进行全局性的有序排列。实现了java.util.SortedSet接口的集合都提供了以下两种比较方法。

• 使用一个实现了Comparable接口的类的对象进行比较。这个对象来源于集合中K-V键值对节点的Key键信息。

• 通过在集合实例化时设置的Comparator比较器进行比较。如果要采用这种方法,那么Set集合需要实现java.util.SortedSet接口。

如果以上两种比较方法都不可用,那么在调用相关方法或对象时,会抛出ClassCastException异常。在java.util. SortedSet接口中的主要方法源码如下。

注意java.util.Comparator接口和java.lang.Comparable接口的区别,具体如下。

• java.util.Comparator:该接口可以解释为比较器,实现该接口的类类似于一个工具,可以对两个传入的对象进行比较。所以Comparator接口中需要被实现的compare(T o1,T o2)方法有两个入参,分别表示要进行比较的对 象 o1 和 对 象 o2 。 本 书 所 说 的 比 较 器 , 通 常 是 指 实 现 了java.util.Comparator接口的类,这些类的对象本身不具有排序功能,它们像工具一样,主要用于帮助其他类的对象完成排序工作。• java.lang.Comparable:该接口可以解释为类的对象本身是可比较的,也就是说,实现该接口的类的对象本身是具有排序功能的,所以Comparable接口中需要被实现的compareTo(T o)方法只有一个入参,表示与本对象进行比较的目标对象。本书所说的一个类的对象能进行比较,通常是指该类实现了java.lang.Comparable接口。


浏览 21
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报