Java Set 集合:HashSet、LinkedHashSet、TreeSet(含使用场景 + List 对比)

在 Java 集合框架中,Set 集合是用于存储不重复元素的核心容器,它衍生出 HashSet、LinkedHashSet、TreeSet 三个常用实现类。本文将从特性、用法、底层原理到使用场景全方位解析,同时对比 List 与 Set 的核心差异,帮你彻底掌握 Set 集合的使用精髓。

一、HashSet 集合

1. HashSet 核心特点

HashSet 是 Set 接口最常用的实现类,底层基于HashMap实现(元素存储在 HashMap 的 key 位置,value 固定为 PRESENT 常量),核心特点如下:

  • 元素无序:存储顺序与添加顺序无关,遍历结果不保证固定
  • 元素不可重复:基于 hashCode ()+equals () 保证唯一性,重复元素添加会被忽略
  • 允许存储null 值(但仅能存储一个 null)
  • 线程不安全:多线程操作需手动同步(如使用 Collections.synchronizedSet)
  • 查找效率高:添加 / 查询 / 删除的平均时间复杂度为 O (1)

2. HashSet 常用方法(附完整示例)

HashSet 继承了 Set 接口的核心方法,以下是高频方法的完整演示:

①:add(Object o):向Set集合中添加元素,不允许添加重复数据。

②:size():返回Set集合中的元素个数

public class Test { public static void main(String[] args) { HashSet<String> set = new HashSet<String>(); //调用HashSet无参构造方法——>创建HashMap对象并给map全局变量。 set.add("你好"); set.add("Map"); System.out.println(set); System.out.println(set.size()); } }

注意:不会按照保存的顺序存储数据(顺序不定),遍历时不能保证下次结果和上次相同。且向HashSet集合中添加元素,HashSet add方法实质是map全局变量调用了put方法,将数据存到了key,因为HashMap的 key不允许,所以HashSet添加的元素也不允许重复。

③.remove(Object o): 删除Set集合中的obj对象,删除成功返回true,否则返回false。

④.isEmpty():如果Set不包含元素,则返回 true。

public class Test { public static void main(String[] args) { HashSet<String> set = new HashSet<String>(); set.add("你好"); set.add("Map"); System.out.println(set.isEmpty()); System.out.println(set.remove("你好")); System.out.println(set); } }

⑤.clear(): 移除此Set中的所有元素。

public class Test { public static void main(String[] args) { HashSet<String> set = new HashSet<String>(); set.add("你好"); set.add("Map"); System.out.println(set); set.clear(); System.out.println(set); } }

⑥.iterator():返回在此Set中的元素上进行迭代的迭代器。

public static void main(String[] args) { HashSet<String> set = new HashSet<String>(); set.add("你好"); set.add("Map"); Iterator<String> ite =set.iterator(); while(ite.hasNext()) { System.out.println(ite.next()); } }

⑦.contains(Object o):判断集合中是否包含obj元素。

public class Test { public static void main(String[] args) { HashSet<String> set = new HashSet<String>(); set.add("你好"); set.add("Map"); System.out.println(set.contains("你好")); } }

⑧:加强for循环遍历Set集合

public class Test { public static void main(String[] args) { HashSet<String> set = new HashSet<String>(); set.add("你好"); set.add("Map"); for (String name : set) { //使用foreach进行遍历。 System.out.println(name); } } }

二、LinkedHashSet 集合

1. LinkedHashSet 核心特点

LinkedHashSet 是 HashSet 的子类,底层基于LinkedHashMap实现,核心特点:

  • 继承 HashSet 的所有特性(不可重复、允许 null、线程不安全)
  • 元素有序:维护了双向链表记录元素的添加顺序,遍历顺序 = 添加顺序
  • 性能略低于 HashSet:因维护链表结构,添加 / 删除的时间复杂度仍为 O (1),但常数项稍大
  • 哈希表 + 链表结构:既保证查询效率,又保证顺序

2. LinkedHashSet 基本使用

2.LinkedHashSet的基本使用

①.创建 LinkedHashSet

2. TreeSet 基本使用

  • 使用默认构造函数创建一个空的 LinkedHashSet。
  • 可以指定初始容量和负载因子。
    import java.util.LinkedHashSet; public class LinkedHashSetExample { public static void main(String[] args) { // 创建一个空的 LinkedHashSet LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>(); // 创建具有初始容量的 LinkedHashSet LinkedHashSet<Integer> linkedHashSetWithCapacity = new LinkedHashSet<>(10); // 创建具有初始容量和负载因子的 LinkedHashSet LinkedHashSet<Double> linkedHashSetWithLoadFactor = new LinkedHashSet<>(10, 0.75f); } }

    2.LinkedHashSet的基本使用

    ①.创建 LinkedHashSet

  • 使用默认构造函数创建一个空的 LinkedHashSet。
  • 可以指定初始容量和负载因子。
    import java.util.LinkedHashSet; public class LinkedHashSetExample { public static void main(String[] args) { // 创建一个空的 LinkedHashSet LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>(); // 创建具有初始容量的 LinkedHashSet LinkedHashSet<Integer> linkedHashSetWithCapacity = new LinkedHashSet<>(10); // 创建具有初始容量和负载因子的 LinkedHashSet LinkedHashSet<Double> linkedHashSetWithLoadFactor = new LinkedHashSet<>(10, 0.75f); } }

    2. 添加元素

  • 使用 add() 方法添加元素。
  • 如果元素已存在,则不会重复添加。
    linkedHashSet.add("Apple"); linkedHashSet.add("Banana"); linkedHashSet.add("Cherry"); linkedHashSet.add("Apple"); // 重复元素,不会添加 System.out.println(linkedHashSet); // 输出: [Apple, Banana, Cherry]

    3. 删除元素

  • 使用 remove() 方法删除指定元素。
  • 使用 clear() 方法清空所有元素。
    linkedHashSet.remove("Banana"); System.out.println(linkedHashSet); // 输出: [Apple, Cherry] linkedHashSet.clear(); System.out.println(linkedHashSet); // 输出: []

    4. 检查元素是否存在

  • 使用 contains() 方法检查是否包含指定元素。
    boolean containsApple = linkedHashSet.contains("Apple"); System.out.println("Contains Apple: " + containsApple); // 输出: Contains Apple: true

    5. 获取大小

  • 使用 size() 方法获取集合中元素的数量。
    int size = linkedHashSet.size(); System.out.println("Size: " + size); // 输出: Size: 2

    6. 遍历 LinkedHashSet

  • 使用 for-each 循环遍历。
  • 使用 Iterator 遍历。
    // 使用 for-each 循环遍历 for (String fruit : linkedHashSet) { System.out.println(fruit); } // 使用 Iterator 遍历 Iterator<String> iterator = linkedHashSet.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); }

    7. 转换为数组

  • 使用 toArray() 方法将 LinkedHashSet 转换为数组。
    String[] array = linkedHashSet.toArray(new String[0]); for (String s : array) { System.out.println(s); }

    8. 其他常用方法

    · isEmpty(): 检查 LinkedHashSet 是否为空。

  • retainAll(): 保留与指定集合相同的元素。
  • removeAll(): 删除与指定集合相同的元素。
    LinkedHashSet<String> fruits = new LinkedHashSet<>(); fruits.add("Apple"); fruits.add("Banana"); fruits.add("Cherry"); LinkedHashSet<String> toRetain = new LinkedHashSet<>(); toRetain.add("Apple"); toRetain.add("Cherry"); fruits.retainAll(toRetain); // 只保留 Apple 和 Cherry System.out.println(fruits); // 输出: [Apple, Cherry] fruits.removeAll(toRetain); // 删除 Apple 和 Cherry System.out.println(fruits); // 输出: []

    三、TreeSet 集合

    1. TreeSet 核心特点

    TreeSet 底层基于红黑树(NavigableMap)实现,核心特点:

  • 元素有序:默认按自然顺序(升序)排列,也支持自定义排序
  • 元素不可重复:基于比较结果(compareTo/Comparator)判断是否重复(返回 0 则视为重复)

①.插入是按字典序排序的输出 : 按照字典序排序的方式进行排序

public class Test { public static void main(String[] args) { TreeSet ts=new TreeSet(); ts.add("agg"); ts.add("abcd"); ts.add("ffas"); Iterator it=ts.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } }

输出 : 按照字典序排序的方式进行排序

abcd agg ffas//输出

②.如果插入的是自定义对象 需要让类实现 Comparable 接口并且必须要重写compareTo

class Person implements Comparable{ String name; int age; Person(String name,int age) { this.name=name; this.age=age; } @Override public int compareTo(Object o) { Person p=(Person)o; //先对姓名字典序比较 如果相同 比较年龄 if(this.name.compareTo(p.name)!=0) { return this.name.compareTo(p.name); } else { if(this.age>p.age) return 1; else if(this.age<p.age) return -1; } return 0; } } public class Test { public static void main(String args[]) { TreeSet ts=new TreeSet(); ts.add(new Person("agg",21)); ts.add(new Person("abcd",12)); ts.add(new Person("ffas",8)); ts.add(new Person("agg",12)); Iterator it=ts.iterator(); while(it.hasNext()) { Person p=(Person)it.next(); System.out.println(p.name+":"+p.age); } } }

输出

abcd:12 agg:12 agg:21 ffas:8

四、HashSet、LinkedHashSet、TreeSet 使用场景对比

五、list和set集合的区别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1165687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qwen3Guard-Gen-WEB数据标注:构建高质量训练集的方法论

Qwen3Guard-Gen-WEB数据标注&#xff1a;构建高质量训练集的方法论 1. 引言&#xff1a;安全审核模型的演进与挑战 随着大语言模型&#xff08;LLM&#xff09;在各类应用场景中的广泛部署&#xff0c;内容安全问题日益凸显。不当、有害或违规内容的生成不仅影响用户体验&…

GLM-ASR-Nano-2512部署优化:如何提升识别准确率300%

GLM-ASR-Nano-2512部署优化&#xff1a;如何提升识别准确率300% 1. 背景与挑战 语音识别技术在智能客服、会议记录、语音助手等场景中扮演着关键角色。GLM-ASR-Nano-2512 是一个强大的开源自动语音识别&#xff08;ASR&#xff09;模型&#xff0c;拥有 15 亿参数&#xff0c…

保护隐私的语音合成|Supertonic完全本地化推理详解

保护隐私的语音合成&#xff5c;Supertonic完全本地化推理详解 1. 引言&#xff1a;为什么需要设备端TTS&#xff1f; 随着人工智能在语音交互场景中的广泛应用&#xff0c;文本转语音&#xff08;Text-to-Speech, TTS&#xff09;技术已成为智能助手、无障碍阅读、有声内容生…

计算机Java毕设实战-基于SpringBoot的网上购物商城设计与实现基于SpringBoot的商品管理、订单处理、购物车【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

YOLO11完整指南:超详细环境配置与项目目录结构解析

YOLO11完整指南&#xff1a;超详细环境配置与项目目录结构解析 1. YOLO11 简介与技术背景 1.1 YOLO11 的核心定位 YOLO&#xff08;You Only Look Once&#xff09;系列作为目标检测领域最具影响力的实时检测框架之一&#xff0c;其最新迭代版本 YOLO11 在保持高推理速度的同…

VibeThinker-1.5B真实体验:AIME数学题全对有多爽

VibeThinker-1.5B真实体验&#xff1a;AIME数学题全对有多爽 在当前大模型普遍追求千亿参数、超大规模训练数据的背景下&#xff0c;微博开源的 VibeThinker-1.5B-WEBUI 却以仅15亿参数和极低训练成本&#xff08;约7,800美元&#xff09;&#xff0c;在AIME等高难度数学竞赛任…

一键识别语音内容、情感与背景音|SenseVoice Small WebUI使用手册

一键识别语音内容、情感与背景音&#xff5c;SenseVoice Small WebUI使用手册 1. 快速入门指南 1.1 环境启动与访问方式 SenseVoice Small WebUI 是基于阿里通义实验室开源的 FunAudioLLM 框架中的 SenseVoice-Small 模型进行二次开发构建的本地化语音理解工具。该系统支持多…

Qwen2.5-0.5B如何省算力?低成本GPU部署实战指南

Qwen2.5-0.5B如何省算力&#xff1f;低成本GPU部署实战指南 1. 引言&#xff1a;为什么选择Qwen2.5-0.5B-Instruct&#xff1f; 在大模型日益庞大的今天&#xff0c;动辄数十亿甚至千亿参数的模型对算力提出了极高要求。然而&#xff0c;并非所有场景都需要“巨无霸”级别的模…

DeepSeek-R1性能优化:让本地推理速度提升50%

DeepSeek-R1性能优化&#xff1a;让本地推理速度提升50% 随着大语言模型在逻辑推理、数学证明和代码生成等复杂任务中的广泛应用&#xff0c;如何在资源受限的设备上实现高效推理成为开发者关注的核心问题。本文聚焦于 DeepSeek-R1-Distill-Qwen-1.5B 这一轻量化蒸馏模型&…

用预置镜像在RTX 4090D上快速完成Qwen2.5-7B微调实战

用预置镜像在RTX 4090D上快速完成Qwen2.5-7B微调实战 1. 引言 大模型微调正从“高门槛实验”走向“轻量化落地”。对于开发者而言&#xff0c;如何在有限时间内高效完成一次高质量的模型定制&#xff0c;已成为实际业务中的关键需求。以 Qwen2.5-7B 这类中等规模的大语言模型…

Glyph模型助力AIGC创作,设计师效率翻倍

Glyph模型助力AIGC创作&#xff0c;设计师效率翻倍 1. 引言 在AIGC&#xff08;人工智能生成内容&#xff09;快速发展的今天&#xff0c;图文内容的自动化生成已成为电商、广告、媒体等领域的核心需求。尤其是在商品海报设计场景中&#xff0c;如何实现高精度文字渲染与高质…

当COBACABANA注入AI灵魂:智能工厂动态调度系统从0到1落地实战

一、AI时代的生产调度困局&#xff1a;为何85%的制造企业陷入"系统失灵"魔咒&#xff1f;2023年中国制造业数字化转型调研报告显示&#xff0c;85%的制造企业在引入智能生产管理系统&#xff08;MES/APS&#xff09;后&#xff0c;依然面临"计划赶不上变化&…

AI智能二维码工坊部署避坑:环境依赖缺失问题解决

AI智能二维码工坊部署避坑&#xff1a;环境依赖缺失问题解决 1. 引言 1.1 业务场景描述 在现代企业级应用中&#xff0c;二维码作为信息传递的重要载体&#xff0c;广泛应用于支付、身份认证、设备绑定、营销推广等场景。为满足快速生成与精准识别的双重需求&#xff0c;AI …

移动端AI新选择:DeepSeek-R1-Distill-Qwen-1.5B

移动端AI新选择&#xff1a;DeepSeek-R1-Distill-Qwen-1.5B 1. 引言&#xff1a;轻量级模型的推理革命 随着大模型在各类应用场景中的广泛落地&#xff0c;如何在资源受限的设备上实现高效、高质量的推理成为工程实践中的关键挑战。传统大模型虽然性能强大&#xff0c;但往往…

5分钟部署SAM 3:零基础玩转图像视频分割

5分钟部署SAM 3&#xff1a;零基础玩转图像视频分割 1. 引言&#xff1a;什么是SAM 3&#xff1f; SAM 3&#xff08;Segment Anything Model 3&#xff09;是由Meta推出的新一代统一基础模型&#xff0c;专为图像与视频中的可提示分割任务设计。它能够通过文本描述或视觉提示…

一键启动通义千问2.5-7B:开箱即用的AI开发环境

一键启动通义千问2.5-7B&#xff1a;开箱即用的AI开发环境 在大模型快速发展的今天&#xff0c;如何高效部署和使用先进语言模型成为开发者关注的核心问题。Qwen2.5 系列作为通义千问最新一代开源模型&#xff0c;在知识覆盖、编程能力、数学推理及结构化数据理解方面实现了显…

Qwen3-4B-Instruct-2507长文本处理:256K上下文实战测试

Qwen3-4B-Instruct-2507长文本处理&#xff1a;256K上下文实战测试 1. 引言 随着大模型在复杂任务中的广泛应用&#xff0c;对长上下文理解能力的需求日益增长。传统语言模型通常受限于8K或32K的上下文长度&#xff0c;在处理法律文档、科研论文、代码库等超长输入时显得力不…

视觉语言模型新思路:Glyph技术原理与实战入门必看

视觉语言模型新思路&#xff1a;Glyph技术原理与实战入门必看 1. 引言&#xff1a;视觉推理的新范式 在当前大模型快速发展的背景下&#xff0c;长上下文建模已成为提升模型理解能力的关键方向。传统方法依赖于扩展基于token的上下文窗口&#xff0c;但这种方式带来了显著的计…

Fun-ASR系统信息查看方法:模型路径与状态监控操作指南

Fun-ASR系统信息查看方法&#xff1a;模型路径与状态监控操作指南 1. 引言 随着语音识别技术在智能客服、会议记录、内容创作等场景的广泛应用&#xff0c;高效易用的本地化语音识别系统成为开发者和企业用户的迫切需求。Fun-ASR 是由钉钉与通义联合推出的语音识别大模型系统…

从三相桥式两电平与T型三电平逆变器看SVPWM调制

三相桥式两电平逆变器的SVPWM调制和三相T型三电平逆变器的SVPWM模型和说明文档。 对比着看绝对有助于你理解SVPWM调制方法。 支持MATLAB2017b以上的版本。在电力电子领域&#xff0c;逆变器的调制策略是至关重要的一环&#xff0c;其中空间矢量脉宽调制&#xff08;SVPWM&#…