Java 23 集合框架详解:Set 接口及实现类(HashSet、TreeSet、LinkedHashSet)
📚 Java 23 集合框架详解:Set 接口及实现类(HashSet、TreeSet、LinkedHashSet)
📖 概述
Set 是 Java 集合框架中用于存储 无序、不重复元素 的接口。它的实现类包括 HashSet、TreeSet 和 LinkedHashSet,它们在底层数据结构、排序规则和性能特性上存在显著差异。
本文将详细介绍 Set 接口及其实现类 的使用案例、底层实现、性能优化方案、多线程优化及注意事项。
🏗️ 1. Set 接口的常用实现类
| 实现类 | 底层数据结构 | 排序方式 | 是否允许 null | 线程安全性 |
|---|---|---|---|---|
HashSet | 哈希表 | 无序 | 允许 | 否 |
TreeSet | 红黑树 | 自然顺序/自定义排序 | 不允许 | 否 |
LinkedHashSet | 哈希表 + 双向链表 | 按插入顺序 | 允许 | 否 |
📋 2. HashSet 详解
✅ 2.1 特点
- 基于哈希表实现,元素按 哈希值 存储,存取效率高。
- 不保证元素顺序。
- 允许存储一个
null值。 - 插入、删除、查找操作的平均时间复杂度为 O(1)。
🔧 2.2 使用案例
import java.util.HashSet;public class HashSetExample {public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("Alice");set.add("Bob");set.add("Charlie");// 尝试添加重复元素set.add("Alice");// 遍历set.forEach(System.out::println);}
}
输出:
Alice
Bob
Charlie
🛠 2.3 优化方案
- 指定初始容量和负载因子:
HashSet<String> set = new HashSet<>(16, 0.75f); - 避免频繁扩容,设置合适的初始容量,减少性能开销。
⚠️ 2.4 多线程优化
HashSet 是 线程不安全的,可以使用 Collections.synchronizedSet() 方法或 ConcurrentHashMap 来实现线程安全。
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;public class SynchronizedHashSetExample {public static void main(String[] args) {Set<String> synchronizedSet = Collections.synchronizedSet(new HashSet<>());synchronizedSet.add("Alice");synchronizedSet.add("Bob");synchronized (synchronizedSet) {synchronizedSet.forEach(System.out::println);}}
}
📋 3. TreeSet 详解
✅ 3.1 特点
- 基于红黑树实现,元素按 自然顺序 或 自定义顺序 排序。
- 不允许存储
null值。 - 插入、删除、查找操作的时间复杂度为 O(log n)。
🔧 3.2 使用案例
import java.util.TreeSet;public class TreeSetExample {public static void main(String[] args) {TreeSet<Integer> set = new TreeSet<>();set.add(20);set.add(10);set.add(30);// 遍历set.forEach(System.out::println);}
}
输出:
10
20
30
🔧 使用自定义排序
import java.util.TreeSet;
import java.util.Comparator;public class CustomTreeSetExample {public static void main(String[] args) {TreeSet<String> set = new TreeSet<>(Comparator.reverseOrder());set.add("Alice");set.add("Bob");set.add("Charlie");set.forEach(System.out::println);}
}
输出:
Charlie
Bob
Alice
🛠 3.3 优化方案
- 避免使用
null值,因为TreeSet不允许存储null。 - 选择合适的排序规则,根据业务需求使用 自然顺序 或 自定义排序。
⚠️ 3.4 多线程优化
TreeSet 是 线程不安全的,可以使用 Collections.synchronizedSet() 来实现线程安全。
import java.util.Collections;
import java.util.TreeSet;
import java.util.Set;public class SynchronizedTreeSetExample {public static void main(String[] args) {Set<Integer> synchronizedSet = Collections.synchronizedSet(new TreeSet<>());synchronizedSet.add(10);synchronizedSet.add(20);synchronized (synchronizedSet) {synchronizedSet.forEach(System.out::println);}}
}
📋 4. LinkedHashSet 详解
✅ 4.1 特点
- 基于哈希表和双向链表实现。
- 保留元素的插入顺序。
- 允许存储一个
null值。
🔧 4.2 使用案例
import java.util.LinkedHashSet;public class LinkedHashSetExample {public static void main(String[] args) {LinkedHashSet<String> set = new LinkedHashSet<>();set.add("Alice");set.add("Bob");set.add("Charlie");// 遍历set.forEach(System.out::println);}
}
输出:
Alice
Bob
Charlie
🛠 4.3 优化方案
- 使用
LinkedHashSet时,考虑内存占用问题,因为双向链表会占用更多内存。 - 适用于需要按插入顺序遍历的场景。
⚠️ 4.4 多线程优化
LinkedHashSet 是 线程不安全的,可以使用 Collections.synchronizedSet() 来实现线程安全。
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;public class SynchronizedLinkedHashSetExample {public static void main(String[] args) {Set<String> synchronizedSet = Collections.synchronizedSet(new LinkedHashSet<>());synchronizedSet.add("Alice");synchronizedSet.add("Bob");synchronized (synchronizedSet) {synchronizedSet.forEach(System.out::println);}}
}
🔄 5. 三者对比总结
| 特性 | HashSet | TreeSet | LinkedHashSet |
|---|---|---|---|
| 底层数据结构 | 哈希表 | 红黑树 | 哈希表 + 双向链表 |
是否允许 null | 是 | 否 | 是 |
| 排序方式 | 无序 | 自然顺序/自定义排序 | 插入顺序 |
| 插入/删除性能 | O(1) | O(log n) | O(1) |
| 适用场景 | 快速查找和去重 | 排序数据集 | 保留插入顺序 |
🎯 6. 选择指南
| 场景 | 推荐实现类 |
|---|---|
| 快速查找和去重 | HashSet |
| 需要排序的集合 | TreeSet |
| 需要保留插入顺序的集合 | LinkedHashSet |
⚙️ 7. 总结
HashSet适用于 快速查找和去重 的场景。TreeSet适用于 需要排序的集合。LinkedHashSet适用于 需要保留插入顺序的集合。
相关文章:
Java 23 集合框架详解:Set 接口及实现类(HashSet、TreeSet、LinkedHashSet)
📚 Java 23 集合框架详解:Set 接口及实现类(HashSet、TreeSet、LinkedHashSet) 📖 概述 Set 是 Java 集合框架中用于存储 无序、不重复元素 的接口。它的实现类包括 HashSet、TreeSet 和 LinkedHashSet,它…...
ARMv8架构 CortexR52+ 内核 coresight_soc400介绍
前言:笔者在工作中接触到了一款多核芯片,其采用的处理器为CortexR52,使用的架构为ARMv8,我通过CoreSight SOC-400组件完成了对该芯片烧录代码的开发。这里芯片型号就不透露了,本文仅介绍我自己从ARM官网上提供的R52核等…...
1.Python浅过(语法基础)
1.简介 Python是一种面向对象的解释型高级编程语言,是强类型的动态脚本语言。 解释型语言跨平台性比编译型语言(如c语言)好。 print("hello world")2.Bug,Debug 多看,多思考,多尝试、查资料、记录 3.prin…...
ioremap_nocache函数
ioremap_nocache 是 Linux 内核中用于将物理地址映射到内核虚拟地址空间的函数,特别是用于 I/O 内存映射,并且禁用缓存。 一、基本语法 void __iomem *ioremap_nocache(phys_addr_t phys_addr, size_t size); 二、基本功能 将物理内存地址映射到内核虚拟…...
【235. 二叉搜索树的最近公共祖先 中等】
题目: 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一…...
构建智能企业:中关村科金大模型企业知识库的技术解析与应用
在数字化转型的浪潮中,企业对智能化知识管理的需求日益增长。知识作为企业的核心资产,其高效管理和应用对于提升企业运营效率和决策质量至关重要。中关村科金大模型企业知识库凭借其强大的技术架构和广泛的应用场景,成为构建智能企业的重要工…...
C++进阶——用Hash封装unordered_map和unordered_set
目录 前言 源码怎么说 为什么要兼容? 兼容的具体做法? 为什么要把Key转为整数(HashFcn)? 模拟实现 一、建立框架 二、迭代器 运算符重载 迭代器兼容大法 三、[ ]重载 四、实现不能修改key 实现及测试代码 …...
b612相机 13.5.5解锁会员hook
工具 lspatch(点击选最新版本下载) shizuku(点击选最新版本下载) SimpleHook(点击选最新版本下载) b612(自行百度下载) 效果图 教程 [{"packageName":"com.camp…...
iOS - 弱引用表(Weak Reference Table)
1. 基本数据结构 // 弱引用表的基本结构 struct weak_table_t {weak_entry_t *weak_entries; // 保存所有的弱引用对象size_t num_entries; // 当前存储的弱引用数量uintptr_t mask; // 哈希表大小掩码uintptr_t max_hash_displacement; /…...
C#语言的网络编程
C#语言的网络编程 引言 随着互联网的飞速发展,网络编程成为了软件开发中的一个重要领域。C#语言作为一种现代编程语言,凭借其丰富的类库、良好的可读性和强大的功能,广泛应用于开发各种网络应用程序。无论是Windows应用、Web应用还是云服务…...
【操作系统】课程 4调度与死锁 同步测练 章节测验
4.1知识点导图 处理机调度与死锁相关内容的文字整理: 基本准则 资源利用率:使系统中的处理机和其他所有资源都尽可能地保持忙碌状态。系统吞吐量:单位时间内系统所完成的作业数。公平性:使各进程都获得合理的CPU时间,而…...
如何查看已经安装的python版本和相关路径信息
如何查看已经安装的python版本和相关路径信息 本文目录: 一、通过命令行模式查询 1、通过命令where python 2、通过命令print(sys.executable) 二、在 Anaconda Navigator 中 三、只安装python的环境下 一、通过命令行模式查询 同时按windowR键,输入cmd&#x…...
设计模式-结构型-适配器模式
在软件开发中,随着系统的不断扩展和模块的不断增加,往往会遇到不同模块之间接口不兼容的情况。此时,如果我们能通过某种方式将一个接口转化为另一个接口,那么开发工作将变得更加灵活和高效。适配器模式(Adapter Patter…...
鸿蒙操作系统(HarmonyOS)
鸿蒙操作系统(HarmonyOS)是华为公司推出的一款面向未来、面向全场景的分布式操作系统。它旨在为用户提供一个更加智能、便捷和安全的操作环境,支持多种终端设备之间的无缝协作。在鸿蒙应用开发中,ArkUI作为官方推荐的用户界面开发…...
基于海思soc的智能产品开发(camera sensor的两种接口)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 对于嵌入式开发设备来说,除了图像显示,图像输入也是很重要的一部分。说到图像输入,就不得不提到camera。目前ca…...
解密LLM结构化输出:代码示例与原理分析
解密LLM结构化输出:代码示例与原理分析 一、LLM结构化输出概述 1. 结构化输出的定义与优势 结构化输出指的是语言模型(LLM)生成的遵循特定格式(如JSON、XML)的数据,这些数据易于解析和处理。相较于非结构…...
Go语言的数据类型
Go语言的数据类型详解 Go语言是一门具有简洁、高效并且强类型的编程语言。它的设计理念之一是让程序员能够以清晰、简明的方式表达自己的意图。在Go语言中,数据类型是其基础构建块之一,理解不同数据类型的特点和使用场景对于编写高效的Go程序至关重要。…...
复杂园区网基本分支的构建
目录 1、各主机进行网络配置。2、交换机配置。3、配置路由交换,进行测试。4、配置路由器接口和静态路由,进行测试。5、最后测试任意两台主机通信情况 模拟环境链接 拓扑结构 说明: VLAN标签在上面的一定是GigabitEthernet接口的,…...
如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?
如何很快将文件转换成另外一种编码格式? 利用VS Code右下角的"选择编码"功能,选择"通过编码保存"可以很方便将文件转换成另外一种编码格式。尤其,在测试w/ BOM或w/o BOM, 或者ANSI编码和UTF编码转换,特别方便。VS文件另…...
《C++11》Lambda 匿名函数从入门到进阶 优缺点分析 示例
Lambda 匿名函数从入门到进阶 C11 引入了 lambda 表达式,这是一种非常强大的功能,可以让我们在代码中定义匿名函数。它们不仅使代码更加简洁,而且在处理回调、算法和多线程编程时极为方便。本文将带你从入门到进阶,全面了解 C11 …...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
