java基础 -10 Set之ConcurrentSkipListSet、EnumSet

ConcurrentSkipListSet

ConcurrentSkipListSet是java中的集合类,是在多线程的环境中使用的,实现Set接口,它基于跳表(skip List)的数据结构。跳表是一种基于并行排序的数据结构,允许快速的出入,删除和查找操作,且在多线程环境中具备良好的并发性能。

主要用途和特点:

  • 线程安全: ConcurrentSkipListSet 是线程安全的,可以在多线程环境中安全的使用呢,无需额外的同步措施。但需要注意的是,他是复合操作,并不保证原子性,故而在特定的应用场景下,可能需要外部同步,从而保证一系列操作的原子性。
  • 有序性: 集合中的元素是有序的,它们按照自然顺序或者通过提供的比较器进行排序。但是在使用比较器的时候,实际上的比较器的接口主要实现了compable接口,为了确保比较器的逻辑和元素的compareTo方法一直,从而避免不一致的排序。
  • 动态扩展:跳表具备动态扩展的特性,可以有效的对应元素的动态添加和删除。

在这里插入图片描述
在这里插入图片描述

常用方法介绍

  • add(E e):

    • 将指定元素添加到集合中,如果集合已包含该元素,则不进行修改。
    • 返回 true 如果元素成功添加,false 如果元素已经存在。
      ConcurrentSkipListSet<String> set = new ConcurrentSkipListSet<>();
      set.add("Apple");
      set.add("Banana");
      
  • addAll(Collection<? extends E> c):

    • 将指定集合中的所有元素添加到集合中。
    • 返回 true 如果集合发生改变,false 如果集合未发生改变。
    Set<String> 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<String> 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<String> 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) {// 创建 EnumSetEnumSet<Days> daysSet = EnumSet.of(Days.MONDAY, Days.WEDNESDAY, Days.FRIDAY);// 遍历 EnumSetfor (Days day : daysSet) {System.out.println(day);}}
}

在使用EnumSet的时候一些注意重要事项:

  • 专用与枚举类型: EnumSet是专门为枚举类型设计的集合,只能存储枚举类型的元素,如果尝试将非枚举类型的元素添加到EnumSet中,将会抛出ClassCastException.
    // 示例:创建存储整数的 EnumSet,会导致编译错误
    EnumSet<Integer> invalidSet = EnumSet.of(1, 2, 3); // 错误!只能存储枚举类型
    
  • 不允许包含null元素:enumSet不允许包含null元素,如果尝试添加null元素,将会抛出NullPointException异常。
    // 示例:创建包含 null 的 EnumSet,会导致运行时异常
    EnumSet<String> invalidSet = EnumSet.of("A", null, "C"); // 错误!不允许包含 null
  • 创建方式:使用EnumSet的静态工厂方法,来创建实例。这些工厂方法提供了方便的方式来初始化EnumSet。
    // 示例:使用 EnumSet.of 创建 EnumSet
    EnumSet<Days> daysSet = EnumSet.of(Days.MONDAY, Days.WEDNESDAY, Days.FRIDAY);
    
  • 位向量表示:EnumSet的实现方式使用位向量,因此它能在内部的表示是非常高效的,并且特别适合用于灭绝类型的优先元素集合。
  • 非线程安全:EnumSet并非线程安全的,如果在多线程环境下使用,需要进行外部同步,或者使用Collections.synchronizedSet方法来创建一个线程安全的EnumSet包装。
// 创建线程安全的 EnumSet
EnumSet<Days> synchronizedDaysSet = Collections.synchronizedSet(EnumSet.of(Days.MONDAY, Days.WEDNESDAY, Days.FRIDAY));

EnumSet常用方法介绍

  • of(E e1, E e2, …, E en):

    • 静态工厂方法,用于创建一个包含指定枚举元素的 EnumSet。
EnumSet<Days> daysSet = EnumSet.of(Days.MONDAY, Days.WEDNESDAY, Days.FRIDAY);
  • allOf(Class< E > elementType):

    • 静态工厂方法,用于创建一个包含指定枚举类型的所有元素的 EnumSet。
EnumSet<Days> allDays = EnumSet.allOf(Days.class);
  • noneOf(Class< E > elementType):

    • 静态工厂方法,用于创建一个空的 EnumSet,指定枚举类型的元素。
EnumSet<Days> emptyDays = EnumSet.noneOf(Days.class);
  • copyOf(EnumSet s):

    • 静态工厂方法,用于复制另一个 EnumSet。
EnumSet<Days> copyDays = EnumSet.copyOf(existingDaysSet);
  • range(E from, E to):

    • 静态工厂方法,用于创建一个包含从 from 到 to 范围内的所有元素的 EnumSet。
EnumSet<Days> weekdays = EnumSet.range(Days.MONDAY, Days.FRIDAY);
  • add(E e) 和 addAll(Collection<? extends E> c):

    • 将指定元素或集合中的所有元素添加到集合中。
EnumSet<Days> daysSet = EnumSet.of(Days.MONDAY, Days.WEDNESDAY);
daysSet.add(Days.FRIDAY);
Set<Days> 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<Days> checkDays = new HashSet<>(Arrays.asList(Days.MONDAY, Days.WEDNESDAY));
boolean containsAll = daysSet.containsAll(checkDays);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/438388.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

selenium-Web界面搜索功能测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 测试环境准备&#xff1a; 1、安装Python 2、安装Ch…

浅谈Cookie跨域获取

《浅谈Cookie跨域获取》首发牧马人博客转发请加此提示 浅谈Cookie跨域获取 背景 最近在接入一个第三方的单点登录平台&#xff0c;使用的Oauth2对接的&#xff0c;本来是没啥问题&#xff0c;奈何退出环节他是使用Cookie进行退出的&#xff0c;这时就涉及到了一个跨域问题。看下…

Mysql查询数据

1 基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT语句。SELECT语句的基本格式是&#xff1a; 2 单表查询 2.1 查询所有字段 SELECT * FROM 表名; 2.2 在SELECT语句中指定所有字段 SELECT f_id, s_id ,f_name, f_price FROM fruits; 2.3 查询单个字段 SELECT 列名FR…

RabbitMQ-如何保证消息不丢失

RabbitMQ常用于 异步发送&#xff0c;mysql&#xff0c;redis&#xff0c;es之间的数据同步 &#xff0c;分布式事务&#xff0c;削峰填谷等..... 在微服务中&#xff0c;rabbitmq是我们经常用到的消息中间件。它能够异步的在各个业务之中进行消息的接受和发送&#xff0c;那么…

Python根据Excel表进行文件重命名

一、问题背景 在日常办公过程中&#xff0c;批量重命名是经常使用的操作。之前我们已经进行了初步探索&#xff0c;主要是通过批处理文件、renamer软件或者Python中的pathlib等模块对当前目录下的文件进行批量重命名。 而今天我们要使用的是PythonExcel的方法对指定目录下的文…

Thymeleaf基础教程

系列文章目录 文章目录 系列文章目录一、Thymeleaf 语法规则二、Thymeleaf 语法分为以下 2 类标准表达式语法th 属性2.1 基础语法2.1.1 变量表达式 ${}2.1.2 选择变量表达式 *{}2.1.3 链接表达式 {} 2.1.4 消息表达式 三、常用的 th 标签四、迭代循环 一、Thymeleaf 语法规则 …

C++类和对象引入以及类的介绍使用

文章目录 一、面向过程和面向对象的初步认识二、类的引入2.2 类的引入 三、类的访问限定符及封装3.3 访问限定符3.4 【面试题】C中struct和class的区别3.5 类的两种定义方式 四、封装【面试题】面向对象的三大特性 五、类的作用域六、类的实例化七、类对象模型7.1 类对象的存储…

网络通信实现

【 一 】网络通信实现 【 1 】实现网络通信的四要素 本机的ip地址 子网掩码 网关的IP地址 DNS的IP地址( 域名系统) DNS服务器是指提供域名解析服务的服务器。它负责将域名转换为相应的IP地址&#xff0c;以便计算机可以通过IP地址与其他设备进行通信。 通过使用DNS服务器…

ESP8266采用AT指令连接华为云服务器方法(MQTT固件)

一、前言 本篇文章主要介绍3个内容&#xff1a; &#xff08;1&#xff09;ESP8266-WIFI模块常用的AI指令功能介绍 &#xff08;2&#xff09;ESP8266烧写MQTT固件连接华为云IOT服务器。 &#xff08;3&#xff09;介绍华为云IOT服务器的配置过程。 ESP8266是一款功能强大…

LVGL部件

一.标签部件 1.如何创建标签部件以及设置文本 ![2024-01-28T09:54:08.png][3] void my_lvgl(void) {lv_obj_t *lablelv_label_create(lv_scr_act()); //创建一个标签lv_label_set_text(lable,"hello"); //普通更改文字lv_label_set_text_fmt(lab…

统计学-认识数据

数据 如&#xff1a; 定性数据&#xff1a; 性别&#xff1a;男、女 颜色&#xff1a;红、绿、青、蓝、紫 教育程度&#xff1a;高中、本科、硕士、博士 评价&#xff1a;好评、中评、差评 定量数据&#xff1a; 年份&#xff1a;2019、2018、2017、2016 温度&#xff1a;10、…

专业133总分400+上海交通大学819考研经验分享上交819电子信息与通信工程

今年专业819信号系统与信号处理133&#xff0c;总分400&#xff0c;如愿考上梦中上海交通大学&#xff0c;通过自己将近一年的复习&#xff0c;实现了人生中目前为止最大的逆袭&#xff08;自己本科学校很普通&#xff09;&#xff0c;总结自己的复习经历&#xff0c;希望可以给…