1.LinkedHashSet全面说明
- LinkedHashSet是HashSet的子类
- LinkedHashSet底层是一个LinkedHashMap,底层维护了一个数组+双向链表
- LinkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序,使得元素看起来是以插入顺序保存的
- LinkedHashSet不允许添加重复元素
说明
- 在LinkedHastSet 中维护了一个hash表和双向链表(LinkedHashSet 有head和tail)
- 每一个节点有before和after属性,这样可以形成双向链表
- 在添加一个元素时,先求hash值,再求索引,确定该元素在table的位置,然后将添加的元素加入到双向链表(如果已经存在,不添加[原则和hashset一样])
-
tail.next= newElement//示意代码
newElement.pre = tail
tail = newEelment;
- 这样的话,我们遍历LinkedHashSet 也能确保插入顺序和遍历顺序一致
2.课后习题

package com.logic.set_;
import java.util.LinkedHashSet;
import java.util.Objects;
/**
* @author logic
* @version 1.0
*/
@SuppressWarnings({"all"})
public class LinkedHashSetExercise {
public static void main(String[] args) {
LinkedHashSet linkedHashSet = new LinkedHashSet();
linkedHashSet.add(new Car("宝马", 30));
linkedHashSet.add(new Car("宝马", 30));
linkedHashSet.add(new Car("奔驰", 30));
linkedHashSet.add(new Car("宝马", 40));
System.out.println(linkedHashSet);
}
}
class Car {
private String name;
private int price;
public Car(String name, int price) {
this.name = name;
this.price = price;
}
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
Car car = (Car) o;
return price == car.price && Objects.equals(name, car.name);
}
@Override
public int hashCode() {
return Objects.hash(name, price);
}
@Override
public String toString() {
return "\nCar{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}