Java----set

Set 是 Java 集合框架(Collection)的核心接口之一,核心特性是不允许存储重复元素,且元素存储通常不保证顺序(部分实现类除外),其底层通过 equals() 和 hashCode() 方法判断元素是否重复。

一、核心特性(3大关键)

  1. 去重性:这是 Set 的标志性能力,添加重复元素时会返回 false 且不存储。判断"重复"的逻辑为:先比较两个元素的 hashCode() 值,若不同则直接视为不同元素;若相同,再调用 equals() 方法,返回 true 则判定为重复。

  2. 无序性(默认):多数实现类(如 HashSet)不保证元素的存储顺序和遍历顺序一致,也不支持通过索引访问元素(区别于 List)。

  3. 线程不安全:所有 Set 接口的实现类(HashSet、TreeSet、LinkedHashSet)默认均为线程不安全,多线程环境下需手动加锁(如使用 Collections.synchronizedSet())或使用并发实现类(如 CopyOnWriteArraySet)。

二、常用实现类对比(3大核心类

Java Set 全面解析

Set 是 Java 集合框架(Collection)的核心接口之一,核心特性是不允许存储重复元素,且元素存储通常不保证顺序(部分实现类除外),其底层通过 equals() 和 hashCode() 方法判断元素是否重复。

一、核心特性(3大关键)

  1. 去重性:这是 Set 的标志性能力,添加重复元素时会返回 false 且不存储。判断"重复"的逻辑为:先比较两个元素的 hashCode() 值,若不同则直接视为不同元素;若相同,再调用 equals() 方法,返回 true 则判定为重复。

  2. 无序性(默认):多数实现类(如 HashSet)不保证元素的存储顺序和遍历顺序一致,也不支持通过索引访问元素(区别于 List)。

  3. 线程不安全:所有 Set 接口的实现类(HashSet、TreeSet、LinkedHashSet)默认均为线程不安全,多线程环境下需手动加锁(如使用 Collections.synchronizedSet())或使用并发实现类(如 CopyOnWriteArraySet)。

二、常用实现类对比(3大核心类)

实现类 底层结构 元素顺序 去重逻辑 性能特点

HashSet 哈希表(数组+链表/红黑树) 无序(不保证顺序) 依赖 hashCode() + equals() 增删查效率极高(O(1)),适合无顺序要求的去重场景

LinkedHashSet 哈希表 + 双向链表 有序(插入顺序) 同 HashSet(继承自 HashSet) 性能略低于 HashSet(需维护链表),适合需保留插入顺序的去重场景

TreeSet 红黑树(自平衡二叉查找树) 有序(自然排序/自定义排序) 依赖 Comparable 或 Comparator 增删查效率为 O(log n),适合需对元素排序的场景(如按数值、字符串字典序排列)

三、关键方法(基于 Set 接口)

Set 接口继承自 Collection,常用方法聚焦"去重相关"和"集合操作":

• 添加元素:boolean add(E e),添加成功返回 true,元素重复返回 false(区别于 List 的 add() 始终返回 true)。

• 批量添加:boolean addAll(Collection<? extends E> c),添加另一个集合的元素,仅添加不重复的部分,返回是否有元素被成功添加。

• 删除元素:boolean remove(Object o),删除指定元素(需通过 equals() 匹配),成功返回 true;void clear() 清空所有元素。

• 判断与查询:boolean contains(Object o)(判断元素是否存在)、int size()(获取元素个数)、boolean isEmpty()(判断是否为空)。

• 遍历方式:支持迭代器(Iterator<E> iterator())、增强 for 循环(for (E e : set)),但不支持普通 for 循环(无索引)。

四、使用注意事项(避坑要点)

重写 hashCode() 和 equals():向 HashSet/LinkedHashSet 中存储自定义对象时,必须同时重写这两个方法,否则会因默认的"地址比较"导致无法正确去重(默认 hashCode() 返回对象内存地址,equals() 比较内存地址)。

示例:自定义 User 类需按 id 去重,则 hashCode() 需基于 id 计算,equals() 需比较 id 是否相等。

相关推荐
码智社14 分钟前
AES加密原理详解及Java实现加解密实战
java·开发语言
克里斯蒂亚诺更新22 分钟前
ruoyi角色权限的对应关系
笔记
萧瑟余晖1 小时前
JDK 26 新特性详解
java·开发语言
马优晨2 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
a1117763 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
维天说4 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
破碎的南瓜4 小时前
sqli--sql注入过关笔记(1,2,3,4,5,9)
数据库·笔记·sql
Zane19945 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
你想知道什么?5 小时前
线性回归-学习笔记
笔记·学习·线性回归
谙弆悕博士5 小时前
系统集成项目管理工程师教程(第3版)笔记——第17章:法律法规和标准规范
笔记·职场和发展·学习方法·业界资讯·软考·法律·法规