LinkedHashSet全面说明:
- LinkedHashSet是HashSet子类;
- 底层是一个LinkedHashMap,底层维护了一个数组和双向链表
- 根据元素的hashCode值来决定元素的位置,同时使用链表维护元素的次序,使得元素看起来是以插入的顺序保存的
- 不允许添加重复元素
- 维护了一个hash表和双向链表,每个节点有pre和next属性
- 在添加一个元素时,先求hash值,在求索引,确定该元素在hashtable中的位置,已经存在则不添加
- 可以保证插入顺序和遍历顺序
- 通过内部类实现LinkedHashMap$Entry 继承HashSet$Node,通过匿名内部类实现;
查看代码
package com.study.set_.linkedhashset; import java.util.LinkedHashSet; import java.util.Objects; /** * @author jay * @version 1.0 * @date 2023/4/18 */ public class LinkedHashSetMethod { public static void main(String[] args) { LinkedHashSet linkedHashSet = new LinkedHashSet(); linkedHashSet.add(new String("AA")); linkedHashSet.add("AA"); linkedHashSet.add("456"); linkedHashSet.add("456"); linkedHashSet.add("hsp"); linkedHashSet.add(new Employee("jack")); //LinkHashSet 顺序一致,底层维护的LinkedHashMap //第一次添加时,直接扩容16,存放的类型是LinkedHashMap$Entry //数组是HashMap$Node[]存放的元素LinkedHashMap$Entry --数组多态 for (Object o :linkedHashSet) { System.out.println(o.hashCode()); } System.out.println(linkedHashSet); } } class Employee{ private String name; public Employee(String name) { this.name = name; } @Override public String toString() { return "Employee{" + "name='" + name + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Employee employee = (Employee) o; return Objects.equals(name, employee.name); } @Override public int hashCode() { return Objects.hash(name); } }