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

相关推荐
Chengbei119 小时前
红队专属Bing Dork自动化工具,敏感信息侦察效率拉满、自动生成可视化信息泄露审计报告
java·人工智能·安全·web安全·网络安全·自动化·系统安全
花舞月咏潭9 小时前
日监测报表自动生成
经验分享
海绵宝宝的月光宝盒9 小时前
2-非金属材料
经验分享·笔记·学习·其他·职场和发展·课程设计·制造
敖正炀9 小时前
集合-Set深入解析
java
下次再写9 小时前
Java互联网大厂面试技术问答实战:涵盖Java SE、Spring Boot、微服务及多场景应用
java·数据库·缓存·面试·springboot·microservices·技术问答
公众号-老炮说Java9 小时前
IDEA 2026.1 + Claude Code = 降维打击
java·ide·intellij-idea
千寻girling9 小时前
RabbitMQ 详细教程(38K字数)
java·后端·面试
zzh0819 小时前
GluserFS笔记
笔记
止语Lab9 小时前
Go vs Java GC:同一场延迟战争的两条路
java·开发语言·golang
卷毛的技术笔记9 小时前
从“拆东墙补西墙”到“最终一致”:分布式事务在Spring Boot/Cloud中的破局之道
java·spring boot·分布式·后端·spring cloud·面试·rocketmq