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 小时前
【2025 年最新版】Java JDK 安装与环境配置教程(附图文超详细,Windows+macOS 通用)
java·开发语言·windows·macos·jdk
猫头虎6 小时前
macOS 双开/多开微信WeChat完整教程(支持 4.X 及以上版本)
java·vscode·macos·微信·编辑器·mac·脚本
二哈喇子!9 小时前
Java开发工具——IDEA(修改全局配置,提升工作效率)
java·编辑器·intellij-idea
强子感冒了9 小时前
Java网络编程学习笔记,从网络编程三要素到TCP/UDP协议
java·网络·学习
二哈喇子!9 小时前
SpringBoot项目右上角选择ProjectNameApplication的配置
java·spring boot
sin220110 小时前
MyBatis的执行流程
java·开发语言·mybatis
Quintus五等升10 小时前
深度学习④|分类任务—VGG13
人工智能·经验分享·深度学习·神经网络·学习·机器学习·分类
二哈喇子!10 小时前
基于Spring Boot框架的车库停车管理系统的设计与实现
java·spring boot·后端·计算机毕业设计
二哈喇子!10 小时前
基于Spring Boot框架的网络游戏虚拟交易平台的设计与实现
java·springboot·毕设项目
二哈喇子!10 小时前
JAVA环境变量配置步骤及测试(JDK的下载 & 安装 & 环境配置教程)
java·开发语言