网站备案资质公司主页网站设计
2026/4/3 6:30:29 网站建设 项目流程
网站备案资质,公司主页网站设计,专业宣传片制作拍摄公司,青海城乡与建设厅网站一、LinkedHashSet 是什么#xff1f;LinkedHashSet 是 Java 集合框架中 java.util 包下的实现类#xff0c;它继承自 HashSet#xff0c;同时实现了 Set 接口#xff0c;底层基于 LinkedHashMap 实现#xff08;本质是「哈希表 双向链表」#xff09;。可以把它理解为LinkedHashSet 是 Java 集合框架中java.util包下的实现类它继承自 HashSet同时实现了Set接口底层基于LinkedHashMap实现本质是「哈希表 双向链表」。可以把它理解为拥有 HashSet 的高效查询、去重特性基于哈希表额外通过双向链表维护元素的插入顺序解决了 HashSet 无序的问题。核心特点有序能精准保留元素的插入顺序遍历顺序 插入顺序但不支持按索引访问不可重复和 HashSet 一样通过hashCode()equals()保证去重允许 null 值仅能有一个 null因为不可重复非线程安全多线程环境需用Collections.synchronizedSet(new LinkedHashSet())包装效率查询 / 增删效率略低于 HashSet多了链表维护的开销但远高于 TreeSet理想时间复杂度仍为O(1)。二、核心原理LinkedHashSet 的底层结构是「哈希表数组 链表 / 红黑树 双向链表」哈希表负责保证元素不重复、高效查询和 HashSet 逻辑一致双向链表额外记录元素的插入顺序遍历的时候按链表顺序输出而非哈希表的随机顺序。简单来说LinkedHashSet 就是给 HashSet 加了一条 “记录插入顺序” 的双向链表既保留了 HashSet 的高效又解决了无序的问题。三、常用操作示例下面是 LinkedHashSet 的完整使用示例代码可直接运行对比 HashSet 能明显看出 “有序” 的特性import java.util.LinkedHashSet; import java.util.Iterator; public class LinkedHashSetDemo { public static void main(String[] args) { // 1. 创建 LinkedHashSet 对象 LinkedHashSetString 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(迭代器遍历); IteratorString iterator lhs.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); // 苹果 → 香蕉 } // 方式3forEach 方法Java 8 System.out.println(forEach遍历); lhs.forEach(System.out::println); // 苹果 → 香蕉 // 6. 清空集合 lhs.clear(); System.out.println(清空后是否为空 lhs.isEmpty()); // true // 7. 自定义类作为元素需重写 hashCode equals和 HashSet 一致 LinkedHashSetBook 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; } // 重写 equalsid 和 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)略高于 HashSetO (1)最优O(log n)核心优势有序 高效去重极致高效去重排序 去重适用场景需保留插入顺序的去重无需有序的高效去重需排序的去重总结LinkedHashSet 继承自 HashSet底层是「哈希表 双向链表」核心特性是保留插入顺序、不可重复、高效查询。它的去重逻辑和 HashSet 完全一致自定义类作为元素时必须重写hashCode()和equals()。选择建议无需有序用 HashSet需保留插入顺序用 LinkedHashSet需排序用 TreeSet。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询