LinkedHashSet底层机制

文章目录

  • 一、LinkedHashSet底层结构
    • 1 底层使用LinkedHashMap
    • 2 底层数据结构
  • 二、使用示例


一、LinkedHashSet底层结构

1 底层使用LinkedHashMap

  • LinkedHashMap是HashMap的一个子类,具有和HashMap相同的存储结构和扩容机制,在此基础上增加了head(头节点)和tail(尾节点)

2 底层数据结构

  • Entry 类型数组 + 单向链表 + 双向链表 + 红黑树
  • Entry 类型数组 继承了 hashmap 的node结构,增加了Entry before, after两个属性
  • 单向链表 用于维护数组的每一个Entry元素的链表关系
  • 双向链表 通过新增的before和after属性进行控制,主要实现了插入顺序和读取顺序保持一致
  • 红黑树 用于把过长的单向链表结构树化

二、使用示例

public class LinkedHashSetTest {
    public static void main(String[] args) {
        LinkedHashSet<Car> carSet = new LinkedHashSet<>();
        // Car 的name和price相等就认为是一样
        carSet.add(new Car("奔驰",new BigDecimal(20000)));
        carSet.add(new Car("奔驰",new BigDecimal(20000)));
        carSet.add(new Car("宝马",new BigDecimal(70000)));
        carSet.add(new Car("宝马",new BigDecimal(80000)));
        carSet.add(new Car("路虎",new BigDecimal(20000)));
        carSet.add(new Car("1",new BigDecimal(1)));
        carSet.add(new Car("2",new BigDecimal(2)));
        carSet.add(new Car("3",new BigDecimal(3)));
        carSet.add(new Car("4",new BigDecimal(4)));
        carSet.add(new Car("5",new BigDecimal(5)));
        carSet.add(new Car("6",new BigDecimal(6)));
        carSet.add(new Car("8",new BigDecimal(8)));
        carSet.add(new Car("9",new BigDecimal(9)));
        carSet.add(new Car("10",new BigDecimal(10)));
        carSet.add(new Car("11",new BigDecimal(11)));
        carSet.add(new Car("12",new BigDecimal(12)));
        carSet.add(new Car("13",new BigDecimal(13)));
        carSet.add(new Car("14",new BigDecimal(14)));
        System.out.println(carSet);
    }
}
class Car{
    private String name;
    private BigDecimal price;

    Car(String name, BigDecimal price) {
        this.name = name;
        this.price = price;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) {return true;}
        if (o == null || getClass() != o.getClass()) {return false;}
        Car car = (Car) o;
        return Objects.equals(name, car.name) &&
                Objects.equals(price, car.price);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, price);
        // 这里返回指定大小的hashCode是为了验证链表树化成红黑树
        //return 100;
    }
    @Override
    public String toString() {
        return "\nCar{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

你可能感兴趣的:(java,java)