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

相关推荐
蜗牛互联网10 分钟前
GPT-6.1 Sol迁移指南:从token单价转向每任务成本门禁
java·人工智能·后端·gpt
蜗牛互联网16 分钟前
HSTU在Dynamo-Triton中的AOTI与KV缓存验收方法
java·人工智能·后端·缓存
Sirens.17 分钟前
Java多线程实例:单例模式、阻塞队列、线程池与定时器
java·开发语言·单例模式
青山木19 分钟前
秒杀系统设计(一):需求拆解与流量治理
java·数据库·redis·后端·架构
zhangrelay27 分钟前
机器人或计算机智能与时间相关案例汇总(ROS2-ROS1)
linux·笔记·学习·ubuntu·机器人
卓怡学长29 分钟前
w195基于ssm“Fitfrend”个性化健身
java·intellij-idea
Neo Wordsworth42 分钟前
随便笔记2
笔记
驭渊的小故事42 分钟前
算法实战:滑动窗口、素数枚举与字符串模拟(三道经典题解)
java·算法
雪落漂泊42 分钟前
Linux基本指令(下)
java·linux·服务器
Eloudy43 分钟前
全文 - version.A - AMBA CHI Chip-to-Chip(C2C)
java·开发语言·数据库·gpu·chiplet