当前位置: 首页 > news >正文

java学习--LinkedHashSet

一、LinkedHashSet 是什么?

LinkedHashSet 是 Java 集合框架中java.util包下的实现类,它继承自 HashSet,同时实现了Set接口,底层基于LinkedHashMap实现(本质是「哈希表 + 双向链表」)。

可以把它理解为:

  • 拥有 HashSet 的高效查询、去重特性(基于哈希表);
  • 额外通过双向链表维护元素的插入顺序,解决了 HashSet 无序的问题。

核心特点:

  • 有序:能精准保留元素的插入顺序(遍历顺序 = 插入顺序),但不支持按索引访问;
  • 不可重复:和 HashSet 一样,通过hashCode()+equals()保证去重;
  • 允许 null 值:仅能有一个 null(因为不可重复);
  • 非线程安全:多线程环境需用Collections.synchronizedSet(new LinkedHashSet<>())包装;
  • 效率:查询 / 增删效率略低于 HashSet(多了链表维护的开销),但远高于 TreeSet,理想时间复杂度仍为O(1)

二、核心原理

LinkedHashSet 的底层结构是「哈希表(数组 + 链表 / 红黑树) + 双向链表」:

  1. 哈希表:负责保证元素不重复、高效查询(和 HashSet 逻辑一致);
  2. 双向链表:额外记录元素的插入顺序,遍历的时候按链表顺序输出,而非哈希表的随机顺序。

简单来说:LinkedHashSet 就是给 HashSet 加了一条 “记录插入顺序” 的双向链表,既保留了 HashSet 的高效,又解决了无序的问题。

三、常用操作示例

下面是 LinkedHashSet 的完整使用示例,代码可直接运行,对比 HashSet 能明显看出 “有序” 的特性:

import java.util.LinkedHashSet; import java.util.Iterator; public class LinkedHashSetDemo { public static void main(String[] args) { // 1. 创建 LinkedHashSet 对象 LinkedHashSet<String> lhs = new LinkedHashSet<>(); // 2. 添加元素(重复元素不会被插入,且保留插入顺序) lhs.add("西瓜"); lhs.add("苹果"); lhs.add("香蕉"); lhs.add("苹果"); // 重复元素,不插入 lhs.add(null); // 允许一个 null System.out.println("初始集合:" + lhs); // 输出:[西瓜, 苹果, 香蕉, null](严格按插入顺序,而非哈希随机顺序) // 3. 判断元素是否存在 boolean hasBanana = lhs.contains("香蕉"); System.out.println("是否包含香蕉:" + hasBanana); // true // 4. 删除元素(删除后链表顺序仍保持) lhs.remove(null); lhs.remove("西瓜"); System.out.println("删除后集合:" + lhs); // 输出:[苹果, 香蕉](剩余元素仍按原插入顺序) // 5. 遍历(三种方式,均按插入顺序输出) // 方式1:增强 for 循环(最常用) System.out.println("增强for循环遍历:"); for (String fruit : lhs) { System.out.println(fruit); // 苹果 → 香蕉 } // 方式2:迭代器 System.out.println("迭代器遍历:"); Iterator<String> iterator = lhs.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); // 苹果 → 香蕉 } // 方式3:forEach 方法(Java 8+) System.out.println("forEach遍历:"); lhs.forEach(System.out::println); // 苹果 → 香蕉 // 6. 清空集合 lhs.clear(); System.out.println("清空后是否为空:" + lhs.isEmpty()); // true // 7. 自定义类作为元素(需重写 hashCode + equals,和 HashSet 一致) LinkedHashSet<Book> bookSet = new LinkedHashSet<>(); bookSet.add(new Book(1, "Java编程思想")); bookSet.add(new Book(2, "Effective Java")); bookSet.add(new Book(1, "Java编程思想")); // 重复,不插入 System.out.println("书籍集合:" + bookSet.size()); // 2 } // 自定义书籍类(重写 hashCode 和 equals 保证去重) static class Book { private int id; private String name; public Book(int id, String name) { this.id = id; this.name = name; } // 重写 hashCode:根据 id 和 name 生成 @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } // 重写 equals:id 和 name 相同则为同一本书 @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Book other = (Book) obj; return id == other.id && (name == null ? other.name == null : name.equals(other.name)); } // 重写 toString,方便打印 @Override public String toString() { return "Book{id=" + id + ", name='" + name + "'}"; } } }

四、LinkedHashSet vs HashSet vs TreeSet(核心对比)

为了帮你理清三者的选择逻辑,这里整理了关键区别:

特性LinkedHashSetHashSetTreeSet
底层结构哈希表 + 双向链表哈希表红黑树
有序性插入顺序无序自然顺序 / 自定义排序
去重规则hashCode() + equals()hashCode() + equals()Comparable/Comparator
允许 null是(仅一个)是(仅一个)
时间复杂度O (1)(略高于 HashSet)O (1)(最优)O(log n)
核心优势有序 + 高效去重极致高效去重排序 + 去重
适用场景需保留插入顺序的去重无需有序的高效去重需排序的去重

总结

  1. LinkedHashSet 继承自 HashSet,底层是「哈希表 + 双向链表」,核心特性是保留插入顺序、不可重复、高效查询
  2. 它的去重逻辑和 HashSet 完全一致,自定义类作为元素时必须重写hashCode()equals()
  3. 选择建议:无需有序用 HashSet,需保留插入顺序用 LinkedHashSet,需排序用 TreeSet。

http://www.jsqmd.com/news/245513/

相关文章:

  • 渗透测试——Funbox2靶机渗透提权详细过程(FTP匿名登陆与SSH爆破)
  • qt qbrush设置填充与取消填充
  • 为什么选择PPO而不是DQN
  • 告别高成本低效率!“轻竹办公AIPPT”高性价比搞定PPT制
  • Springboot影视周边电商平台hlnap(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 2026年降AIGC终极指南:10款主流降AI工具深度横评,看这篇就够了【建议收藏】
  • Springboot应急信息管理及统计分析系统5y51w(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • TVS管并联提升通流为何反而导致钳位不稳?
  • 安全左移:国产信创DevOps平台的安全(DevSecOps)构建与实践
  • 破局多平台管理困境:一体化终端管理如何成为企业效率引擎?
  • 2026降AIGC工具大盘点:免费、在线、一键生成,亲测10款降ai工具,到底哪个更适合你?
  • 论文AI率太高怎么办?亲测这10款降AI率工具,手把手教你如何降低ai率【2026最新】
  • 1_4_五段式SVPWM (传统算法反正切+DPWM0)算法理论与 MATLAB 实现详解
  • AI率从90%降到10%,亲测有效的降AI率工具,这10款总有一款适合你的论文降AIGC!
  • 单电感玩转电池均衡:一个Buck-Boost引发的“血案
  • 搞懂 SVPWM 不用愁!这份 “保姆级” 算法 + MATLAB 实操资源来了
  • 【干货收藏】提升AI智能体记忆能力:8种策略详解与实战应用
  • 1_3_五段式SVPWM (传统算法反正切+DPWMmax)算法理论与 MATLAB 实现详解
  • 三相交错LLC谐振仿真闭环,Y型联接(图1主回路图),自均流(图2三相谐振电流波形)
  • 电动汽车充电站选址定容:基于粒子群算法与交通网络流量的探索
  • 1986-2023年并购SDC数据库数据
  • 1_1_七段式SVPWM (传统算法反正切)算法理论与 MATLAB 实现详解
  • 基于西门子PLC S7 - 1200系列的立体车库设计全解析
  • 1_2_五段式SVPWM (传统算法反正切+DPWMmin)算法理论与 MATLAB 实现详解
  • python基于flask框架的校园论坛系统
  • Springboot新能源科普网站i5ghr(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 2007-2023年国家自主创新示范区
  • python基于flask框架的在线电影票购买系统的设计与实现
  • 三端MMC自适应下垂控制模型预测与优化算法研究
  • 1998-2024年上市公司财务冗余数据+stata代码