LinkedHashSet(Set接口的实现类)

LinkedHashSet的简介

  1. LinkedHashSet是HashSet的子类
  2. 底层是一个LinkedHashMap,底层维护的一个数组+双向链表
  3. 根据元素hascode的值决定元素存储的位置,同时使用链表维护元素 的次序图,这使得元素看起来是以插入顺序保存的。双向链表的pre和next指向前一个和下一个元素,看起来有序
  4. LinkedHashSet不允许添加重复的元素

而LinkedHashSet的添加机制与HashSet相同

第一次添加时,直接将数组table【】扩容到16,存放的节点类型时LinkedHashSet$Entry,而如果想要将其放入到其中,则Entry应该使继承了Node的

image-20220312101443718

image-20220704182416122

练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.time.LocalDate;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Objects;

public class Test {
public static void main(String[] args) {
LinkedHashSet linkedHashSet=new LinkedHashSet();
linkedHashSet.add(new Car("奥迪",46465));
linkedHashSet.add(new Car("奥迪",46465));
linkedHashSet.add(new Car("奥迪",46465));
System.out.println(linkedHashSet);
}
}
class Car{
String name;
double value;

public Car(String name, double value) {
this.name = name;
this.value = value;
}

@Override
public int hashCode(){
return Objects.hash(name,value);
}

@Override
public boolean equals(Object o){
if (o==this){
return true;
}
Car car=(Car) o;
if (Objects.equals(car.name,name)&&car.value==value){
return true;
}
else {return false;}
}
}

image-20220704182424042