Set家族

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

目录

一. 前言

二. 实现类

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是线程安全的有序的集合,适用于高并发的场景。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

流华追梦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值