一、LinkedHashSet底层结构
1 底层使用LinkedHashMap
- LinkedHashMap是HashMap的一个子类,具有和HashMap相同的存储结构和扩容机制,在此基础上增加了head(头节点)和tail(尾节点)
2 底层数据结构
- Entry 类型数组 + 单向链表 + 双向链表 + 红黑树
- Entry 类型数组 继承了 hashmap 的node结构,增加了Entry<K,V> before, after两个属性
- 单向链表 用于维护数组的每一个Entry元素的链表关系
- 双向链表 通过新增的before和after属性进行控制,主要实现了插入顺序和读取顺序保持一致
- 红黑树 用于把过长的单向链表结构树化
二、使用示例
public class LinkedHashSetTest {
public static void main(String[] args) {
LinkedHashSet<Car> carSet = new LinkedHashSet<>();
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);
}
@Override
public String toString() {
return "\nCar{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}