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 是否相等。

相关推荐
二哈赛车手6 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
栗子~~6 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
天竺鼠不该去劝架6 小时前
金融行业 AI Agent 落地架构 存量银行系统适配改造方案
经验分享
YDS8296 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
未若君雅裁8 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手8 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
xian_wwq8 小时前
【学习笔记】AGC协调控制系统概述
笔记·学习
阿维的博客日记9 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI9 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
weixin_537217069 小时前
答辩ppt模板资源合集
经验分享