ConcurrentSkipListSet
ConcurrentSkipListSet是java中的集合类,是在多线程的环境中使用的,实现Set接口,它基于跳表(skip List)的数据结构。跳表是一种基于并行排序的数据结构,允许快速的出入,删除和查找操作,且在多线程环境中具备良好的并发性能。
主要用途和特点:
- 线程安全: ConcurrentSkipListSet 是线程安全的,可以在多线程环境中安全的使用呢,无需额外的同步措施。但需要注意的是,他是复合操作,并不保证原子性,故而在特定的应用场景下,可能需要外部同步,从而保证一系列操作的原子性。
- 有序性: 集合中的元素是有序的,它们按照自然顺序或者通过提供的比较器进行排序。但是在使用比较器的时候,实际上的比较器的接口主要实现了compable接口,为了确保比较器的逻辑和元素的compareTo方法一直,从而避免不一致的排序。
- 动态扩展:跳表具备动态扩展的特性,可以有效的对应元素的动态添加和删除。
常用方法介绍
-
add(E e):
- 将指定元素添加到集合中,如果集合已包含该元素,则不进行修改。
- 返回 true 如果元素成功添加,false 如果元素已经存在。
ConcurrentSkipListSet
set = new ConcurrentSkipListSet<>(); set.add("Apple"); set.add("Banana"); -
addAll(Collection extends E> c):
- 将指定集合中的所有元素添加到集合中。
- 返回 true 如果集合发生改变,false 如果集合未发生改变。
Set
fruits = new HashSet<>(Arrays.asList("Orange", "Grape")); set.addAll(fruits); -
remove(Object o):
- 从集合中移除指定元素。
- 返回 true 如果元素存在并成功移除,false 如果元素不存在。
set.remove("Banana");
-
contains(Object o):
- 判断集合是否包含指定元素。
- 返回 true 如果元素存在,false 如果元素不存在。
boolean containsApple = set.contains("Apple");
-
size():
- 返回集合中的元素数量。
int setSize = set.size();
-
isEmpty():
- 判断集合是否为空。
- 返回 true 如果集合为空,false 如果集合不为空。
boolean isEmpty = set.isEmpty();
-
iterator():
-
返回集合的迭代器,可以用于遍历集合中的元素。
Iterator
iterator = set.iterator(); while (iterator.hasNext()) { String element = iterator.next(); // 处理元素 } -
first() 和 last():
- 返回集合中的第一个和最后一个元素,分别是最小和最大的元素。
String firstElement = set.first(); String lastElement = set.last();
public class ConcurrentSkipListSetExample { public static void main(String[] args) { ConcurrentSkipListSet
skipListSet = new ConcurrentSkipListSet<>(); // 添加元素 skipListSet.add("Apple"); skipListSet.add("Banana"); skipListSet.add("Orange"); // 遍历元素 for (String fruit : skipListSet) { System.out.println(fruit); } } } 作为Java中主要与多线程中需要有序集合,并且能够对并发访问有较高的要求的问题,他主要设计目标是提供一个线程安全的,支持并发访问的有序集合,具备良好的信呢和拓展性。
主要适用场景在于:
-
高并发的有序集合:当需要在多线程环境中使用有序集合时,ConcurrentSkipListSet 提供了一种线程安全的选择。它支持在集合中进行并发插入、删除和查找操作,而无需额外的同步措施。
-
无锁并发操作: ConcurrentSkipListSet 内部基于跳表数据结构实现,该结构允许在并发环境中进行无锁操作。这种设计使得在多线程访问时,不需要显式地加锁,从而提高了并发性能。
-
动态扩展和收缩: 跳表的特性允许动态地进行插入和删除操作,而不会导致整体性能的急剧下降。这对于需要频繁修改集合的应用场景非常有用。
-
迭代器的弱一致性: ConcurrentSkipListSet 提供了弱一致性的迭代器,这意味着在迭代过程中可以容忍一些并发修改,从而在多线程环境中提供了一种灵活的迭代方式。
-
有序性的需求: 如果应用程序需要元素按照一定的顺序排列,可以通过自然顺序或者通过提供比较器来实现有序性。
EnumSet
EnumSet 是专门为枚举类型设计的集合类,它在内部使用位向量表示集合元素,因此在性能和内存使用方面都非常高效。
主要特点:
-
专门用于枚举类型: EnumSet被设计用于存储枚举类型的元素,它提供了高效的位向量表示。
-
不允许null元素: EnumSet不允许包含null元素。
-
非线程安全:EnumSet不是线程安全的,如果在多线程环境中使用,需要进行外部同步。
public class EnumSetExample { enum Days { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } public static void main(String[] args) { // 创建 EnumSet EnumSet
daysSet = EnumSet.of(Days.MONDAY, Days.WEDNESDAY, Days.FRIDAY); // 遍历 EnumSet for (Days day : daysSet) { System.out.println(day); } } } 在使用EnumSet的时候一些注意重要事项:
- 专用与枚举类型: EnumSet是专门为枚举类型设计的集合,只能存储枚举类型的元素,如果尝试将非枚举类型的元素添加到EnumSet中,将会抛出ClassCastException.
// 示例:创建存储整数的 EnumSet,会导致编译错误 EnumSet
invalidSet = EnumSet.of(1, 2, 3); // 错误!只能存储枚举类型 - 不允许包含null元素:enumSet不允许包含null元素,如果尝试添加null元素,将会抛出NullPointException异常。
// 示例:创建包含 null 的 EnumSet,会导致运行时异常 EnumSet
invalidSet = EnumSet.of("A", null, "C"); // 错误!不允许包含 null - 创建方式:使用EnumSet的静态工厂方法,来创建实例。这些工厂方法提供了方便的方式来初始化EnumSet。
// 示例:使用 EnumSet.of 创建 EnumSet EnumSet
daysSet = EnumSet.of(Days.MONDAY, Days.WEDNESDAY, Days.FRIDAY); - 位向量表示:EnumSet的实现方式使用位向量,因此它能在内部的表示是非常高效的,并且特别适合用于灭绝类型的优先元素集合。
- 非线程安全:EnumSet并非线程安全的,如果在多线程环境下使用,需要进行外部同步,或者使用Collections.synchronizedSet方法来创建一个线程安全的EnumSet包装。
// 创建线程安全的 EnumSet EnumSet
synchronizedDaysSet = Collections.synchronizedSet(EnumSet.of(Days.MONDAY, Days.WEDNESDAY, Days.FRIDAY)); EnumSet常用方法介绍
-
of(E e1, E e2, …, E en):
- 静态工厂方法,用于创建一个包含指定枚举元素的 EnumSet。
EnumSet
daysSet = EnumSet.of(Days.MONDAY, Days.WEDNESDAY, Days.FRIDAY); -
allOf(Class< E > elementType):
- 静态工厂方法,用于创建一个包含指定枚举类型的所有元素的 EnumSet。
EnumSet
allDays = EnumSet.allOf(Days.class); -
noneOf(Class< E > elementType):
- 静态工厂方法,用于创建一个空的 EnumSet,指定枚举类型的元素。
EnumSet
emptyDays = EnumSet.noneOf(Days.class); -
copyOf(EnumSet s):
- 静态工厂方法,用于复制另一个 EnumSet。
EnumSet
copyDays = EnumSet.copyOf(existingDaysSet); -
range(E from, E to):
- 静态工厂方法,用于创建一个包含从 from 到 to 范围内的所有元素的 EnumSet。
EnumSet
weekdays = EnumSet.range(Days.MONDAY, Days.FRIDAY); -
add(E e) 和 addAll(Collection extends E> c):
- 将指定元素或集合中的所有元素添加到集合中。
EnumSet
daysSet = EnumSet.of(Days.MONDAY, Days.WEDNESDAY); daysSet.add(Days.FRIDAY); Set weekend = new HashSet<>(Arrays.asList(Days.SATURDAY, Days.SUNDAY)); daysSet.addAll(weekend); - clear():
- 清空集合中的所有元素。
daysSet.clear();
- size() 和 isEmpty():
- 返回集合中的元素数量和判断集合是否为空。
int setSize = daysSet.size(); boolean isEmpty = daysSet.isEmpty();
- contains(Object o) 和 containsAll(Collection> c):
- 判断集合是否包含指定元素或集合中的所有元素。
boolean containsMonday = daysSet.contains(Days.MONDAY); Set
checkDays = new HashSet<>(Arrays.asList(Days.MONDAY, Days.WEDNESDAY)); boolean containsAll = daysSet.containsAll(checkDays);
- 判断集合是否包含指定元素或集合中的所有元素。
- contains(Object o) 和 containsAll(Collection> c):
- 返回集合中的元素数量和判断集合是否为空。
- size() 和 isEmpty():
- 清空集合中的所有元素。
- clear():
- 将指定元素或集合中的所有元素添加到集合中。
-
- 静态工厂方法,用于创建一个包含从 from 到 to 范围内的所有元素的 EnumSet。
-
- 静态工厂方法,用于复制另一个 EnumSet。
-
- 静态工厂方法,用于创建一个空的 EnumSet,指定枚举类型的元素。
-
- 静态工厂方法,用于创建一个包含指定枚举类型的所有元素的 EnumSet。
-
- 静态工厂方法,用于创建一个包含指定枚举元素的 EnumSet。
-
- 专用与枚举类型: EnumSet是专门为枚举类型设计的集合,只能存储枚举类型的元素,如果尝试将非枚举类型的元素添加到EnumSet中,将会抛出ClassCastException.
-
-
- 返回集合中的第一个和最后一个元素,分别是最小和最大的元素。
- 返回集合中的元素数量。
-
猜你喜欢
- 6天前Unity跨平台开发指南(PCVRAndroidWebGL)
- 6天前django集成路线与VR的房屋租赁管理的设计与实现(程序+开题报告)
- 6天前ai电销机器人的优势
- 6天前HarmonyOS应用配置文件module对象内部结构(FA模型)
- 6天前问题记录:Caused by: java.net.BindException: Address already in use: JVM
- 6天前.Net使用Dapper框架(快速上手)
- 6天前1-1 二次开发SDK算子包学习过程之环境配置
- 6天前【使用opencv、python、dlib实现人脸关键点检测、眨眼检测和嘴巴开闭检测,可简单用于疲劳检测】
- 6天前IOS 计算富文本的高度方法
- 6天前安装elasticsearch、kibana、IK分词器
网友评论
- 搜索
- 最新文章
- 热门文章