当前位置: 首页 > news >正文

Java中Set集合的概念

java.util.Set 是 Java 集合框架的子接口,继承自 Collection 接口,核心特征是存储的元素无序且不可重复,不支持通过索引访问元素。

一、核心特性

1. 元素唯一性

Set 集合不允许存储重复元素,判断元素是否重复的依据是 equals() 方法和 hashCode() 方法——两个元素若 equals() 返回 true ,则 hashCode() 必须相等,反之不一定。当向 Set 中添加重复元素时, add() 方法会返回 false ,且集合不会发生变化。

2. 无序性

这里的无序指元素不会按插入顺序保存,也没有索引下标。遍历 Set 集合时,元素的输出顺序可能与插入顺序不同,具体表现由不同实现类决定。

3. 允许存储 null 元素

大部分 Set 实现类(如 HashSet )支持存储一个 null 元素, TreeSet 则不支持,向其存入 null 会抛出 NullPointerException 。

4. 线程不安全

常用的 HashSet 、 TreeSet 等实现类默认线程不安全,若多线程并发修改,需手动通过 Collections.synchronizedSet() 方法包装成线程安全的集合。

二、常用实现类

1. HashSet

基于 HashMap 实现,元素会作为 HashMap 的 key 存储。它的存取效率高,时间复杂度接近 O(1);元素无序;允许存储一个 null 元素;依赖 hashCode() 和 equals() 保证元素唯一性。

2. LinkedHashSet

基于 LinkedHashMap 实现,继承自 HashSet 。它兼具 HashSet 的元素唯一性,同时会维护元素的插入顺序,遍历顺序与插入顺序一致;存取效率略低于 HashSet。

3. TreeSet

基于红黑树实现。元素会自动按自然顺序(需实现 Comparable 接口)或指定比较器( Comparator )排序;不允许存储 null 元素;存取、查找的时间复杂度为 O(log n);元素唯一性通过比较器或 compareTo() 方法判断。

三、常用方法

Set 接口继承自 Collection 接口,常用方法如下:

1. 添加元素: boolean add(E e) —— 添加成功返回 true ,元素重复返回 false ; boolean addAll(Collection<? extends E> c) —— 添加另一个集合的所有元素。

2. 删除元素: boolean remove(Object o) —— 删除指定元素,成功返回 true ; void clear() —— 清空集合。

3. 判断元素: boolean contains(Object o) —— 判断集合是否包含指定元素; boolean isEmpty() —— 判断集合是否为空。

4. 获取长度: int size() —— 返回集合中元素的个数。

5. 遍历方式:支持增强 for 循环、迭代器(Iterator)遍历,不支持普通 for 循环(无索引)。

四、使用注意事项

1. 向 Set 中存储自定义对象时,必须重写 equals() 和 hashCode() 方法,否则无法保证元素唯一性,因为默认会使用 Object 类的方法,比较的是对象地址。

2. TreeSet 存储的元素要么实现 Comparable 接口,要么在创建 TreeSet 时传入 Comparator 比较器,否则会抛出 ClassCastException 。

3. HashSet 的元素顺序可能受元素 hashCode 影响,不要依赖其遍历顺序;若需有序,优先使用 LinkedHashSet 。

http://www.cnnetsun.cn/news/107421.html

相关文章:

  • DTLN实时降噪技术:用AI算法打造纯净语音体验的完整指南
  • 移动端视频录制技术革新:基于MediaRecorder的高性能解决方案
  • EmotiVoice与RVC的区别是什么?一文讲清两者定位差异
  • EmotiVoice语音合成中断怎么办?常见错误排查
  • ComfyUI-SeedVR2视频超分插件完整安装与配置指南
  • 开源TTS新星崛起:EmotiVoice为何备受开发者青睐?
  • 记录Kibana多实例竞争导致的迁移锁
  • PySlowFast混合精度训练终极技巧:快速突破视频模型性能瓶颈的完整解决方案
  • 多肽合成丨HNGS14G CAS号: 330936-70-4
  • 43、Linux 网络安全:防火墙与认证机制深度解析(上)
  • 44、一次性密码与安全外壳:保障系统安全登录的有效手段
  • PostgreSQL pgvector扩展:向量相似性搜索的终极实践指南
  • 50、Linux系统安装与磁盘分区全攻略
  • 27、Linux 路由软件配置指南
  • KISS FFT轻量级信号处理终极指南:从入门到精通
  • 快速掌握X-AnyLabeling:GeCO模型在目标计数中的完整实践指南
  • Mac M1芯片运行EmotiVoice性能表现如何?
  • 如何快速构建Next.js多租户认证系统:终极完整指南
  • 计算机Java毕设实战-基于JAVA的北京市公交管理系统基于Java的城市公交查询管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 计算机Java毕设实战-基于SpringBoot的景点门票销售管理系统基于JAVA白云山景点门票销售管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 价值投资中的智能化精准癌症治疗系统分析
  • 前端一把梭,后端火葬场:别再让你的 Node.js 服务“裸奔”了
  • NVIDIA显卡配置实用手册:从日常应用到专业调校
  • 30、Shell脚本编写与Bash安装指南
  • 31、Bash使用与相关Shell比较全解析
  • 33、Bash 环境变量、操作符及选项全解析
  • 前端环境配置(nvm、nodejs、npm)
  • RK3588语音AI部署终极指南:算子兼容性深度优化与实战解决方案
  • EmotiVoice语音好奇感模拟促进知识探索
  • Abaqus轮轨瞬态动力学分析:从模型搭建到inp文件生成