这篇文章讲的是LinkedHashSet。
LinkedHashSet的全面说明
看一下右边LinkedHashSet和HashSet的关系 (图中实线代表继承关系、虚线代码实现关系,如LinkedHashSet继承HashSet,LinkedHashSet实现了Set接口)。
- LinkedHashSet底层是一个LinkedHashMap,底层维护了一个 数组和双向链表。
- LinkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
- LinkedHashSet不允许添重复元素。
LinkedHashSet的底层机制
韩老师用一张图片就解释清楚了,不懂得非常建议去看韩老师视频,讲的非常详细。
解读:
LinkedHashSet加入顺序和取出元素/数据顺序一致
LinkedHashSet底层维护LinkedHashMap(是HashMap的子类)
LinkedHashSet 底层结构(数组table+双向链表)
添加第一次时,直接将 数组table扩容到 16,存放的结点类型是LinkedHashMap$Entry
数组是HashMap$Node[] 存放的元素/数据是LinkedHashMap$Entry类型
LinkedHashSet的练习题
题目
创建Car类,添加name和price属性,如果name和price相同,则认为是相同元素,就不能添加。
代码展示
package com.lwtstu4.Exercise;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Objects;
public class LinkedHashSetExercise {
public static void main(String[] args) {
LinkedHashSet linkedHashSet = new LinkedHashSet();
linkedHashSet.add(new Car("奥拓",1000));
linkedHashSet.add(new Car("奥迪",300000));
linkedHashSet.add(new Car("法拉利",100000000));
linkedHashSet.add(new Car("奥迪",300000));
linkedHashSet.add(new Car("保时捷",700000000));
linkedHashSet.add(new Car("奥迪",300000));
System.out.println(linkedHashSet);
}
}
class Car{
public String name;
public double price;
public Car(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "\nCar{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
//重写equals和hashCode方法
@Override
public boolean equals(Object o) { //main中 new出来的对象,如果和已有的对象相同则不能添加
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Car car = (Car) o;
return Double.compare(price, car.price) == 0 && Objects.equals(name, car.name);
}
@Override
public int hashCode() { //main中 ,new 出来的对象都可以添加
return Objects.hash(name, price);
}
}
测试结果