java学习日记20230415-LinkedHashSet源码

发布时间 2023-04-19 22:16:33作者: 、子夜

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);
        }
    }