Set家族

文章详细介绍了Java中Set接口的几种实现类,包括HashSet(无序,非同步)、LinkedHashSet(有序,非同步)、TreeSet(有序,可自定义排序)、EnumSet(枚举类型专用,高效)以及线程安全的CopyOnWriteArraySet和ConcurrentSkipListSet。这些类各有特点,适用于不同的场景需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一. 前言

二. 实现类

2.1. HashSet

2.2. LinkedHashSet

2.3. TreeSet

2.4. EnumSet

2.5. CopyOnWriteArraySet

2.6. ConcurrentSkipListSet


一. 前言

该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素。用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。

List是有序集合的根接口,Set是无序集合的根接口,无序也就意味着元素不重复。更严格地说,Set集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多一个空元素。
使用Set存储的特点与List相反:元素无序、不可重复。常用的实现方式:HashSet、LinkedHashSet和TreeSet。

二. 实现类

2.1. HashSet

HashSet中没有重复元素,底层由HashMap实现,不保证元素的顺序(此处的没有顺序是指:元素插入的顺序与输出的顺序不一致),HashSet允许使用Null元素,HashSet是非同步的。

2.2. LinkedHashSet

LinkedHashSet继承自HashSet,其底层是基于LinkedHashMap来实现的,有序,非同步。
LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。

2.3. TreeSet

TreeSet底层是基于TreeMap实现的,所以元素有序。TreeSet支持两种排序方式,自然排序和定制排序,其中自然排序为默认的排序方式。当我们构造TreeSet时,若使用不带参数的构造函数,则TreeSet的使用自然比较器;若用户需要使用自定义的比较器,则需要使用带比较器的参数。TreeSet是线程不安全的。

2.4. EnumSet

之前介绍的Set接口的实现类HashSet/TreeSet,它们内部都是用对应的HashMap/TreeMap实现的,但EnumSet不是,它的实现与EnumMap没有任何关系,而是用极为精简和高效的位向量实现的。EnumSet可以说是处理枚举类型数据的一把利器。

2.5. CopyOnWriteArraySet

CopyOnWriteArraySet基于CopyOnWriteArrayList实现,其唯一的不同是在add时调用的是CopyOnWriteArrayList的addIfAbsent(若没有则增加)方法。线程安全的无序的集合,可以将它理解成线程安全的HashSet。有意思的是,CopyOnWriteArraySet和HashSet虽然都继承于共同的父类AbstractSet;但是,HashSet是通过“散列表(HashMap)”实现的,而CopyOnWriteArraySet则是通过“动态数组(CopyOnWriteArrayList)”实现的,并不是散列表。

2.6. ConcurrentSkipListSet

ConcurrentSkipListSet与ConcurrentSkipListMap的关系,和SET与HashMap的关系类似,就是采用“组合”的方式: ConcurrentSkipListSet组合了一个ConcurrentSkipListMap,将元素作为 ConcurrentSkipListMap的key存放。ConcurrentSkipListSet是线程安全的有序的集合,适用于高并发的场景。

04-02
### 关于 `VOS_SET` 的技术背景 目前,在已有的引用资料中并未提及具体的 `VOS_SET` 技术文档或其使用方法。然而,基于常见的命名惯例和技术领域推测,`VOS_SET` 很可能是一个特定平台下的函数或者宏定义,用于操作集合(Set),类似于文件描述符集合的操作方式[^3]。 如果假设 `VOS_SET` 是一种类似的实现机制,则可以参考标准的集合操作模式来理解它的功能: #### 集合操作基础 在许多操作系统接口中,集合通常被用来管理一组资源,比如文件描述符集合中的 `FD_SET` 函数家族。以下是典型的集合操作函数及其作用: - **`FD_ZERO(fd_set *set)`**: 清空指定的集合。 - **`FD_SET(int fd, fd_set *set)`**: 将给定的文件描述符添加到集合中。 - **`FD_CLR(int fd, fd_set *set)`**: 从集合中移除指定的文件描述符。 - **`FD_ISSET(int fd, fd_set *set)`**: 测试某个文件描述符是否存在于集合中。 这些操作提供了对集合的基本增删查改能力。对于 `VOS_SET` 而言,它可能是某种扩展版本,支持更复杂的逻辑处理或者是针对特定环境优化后的集合操作工具。 #### 编译选项关联 考虑到某些跨平台开发场景下编译器设置的重要性,也许还需要关注项目的构建配置部分是否有特殊要求。例如,在 Windows 平台上通过 qmake 工具链调整字符编码参数的情况就体现了这一点[^4]: ```qmake win32{ QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8 } ``` 这种做法确保了程序能够正确解析并显示中文字符串等内容,从而减少因本地化问题引发的功能异常风险。 如果没有官方发布的具体手册可供查阅的话,建议尝试联系相关技术支持团队获取权威解释;另外也可以查看源代码仓库是否存在注释详尽的部分帮助理解其实现细节。 ### 示例代码片段 下面给出一段伪代码展示如何利用假想中的 `VOS_SET` API 来完成简单的任务模拟过程: ```c #include <stdio.h> // 假设头文件中有如下声明 void vos_zero(VOS_SET* set); int vos_add(VOS_SET* set, int element); int vos_remove(VOS_SET* set, int element); int vos_contains(VOS_SET* set, int element); int main(){ VOS_SET mySet; // 初始化集合为空状态 vos_zero(&mySet); // 添加元素至集合内 if(vos_add(&mySet, 7)){ printf("Element added successfully.\n"); } // 查询某元素是否存在 if(vos_contains(&mySet, 7)){ printf("The number '7' is present in the set.\n"); } return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流华追梦

你的鼓励将是我创作最大的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值