Java--集合--LinkedHashSet
- LinkedHashSet全面说明
-
底层机制示意图
-
源码分析
-
LinkedHashSet加入顺序和取出元素/数据的顺序一致
-
LinkedHashSet底层维护的是一个LinkedHashMap (是HashMap的 子类)(数组 + 双向链表)
-
LinkedHashSet底层结构( 数组tabLe+双向链表)
-
添加第次时,直接将 数组table扩容到16 ,存放 的结点类型是LinkedHashMap$Entry
-
数组是HashMap$Node[] 存放的元素/数据是LinkedHashMap$Entry类型
-
-
static class Entry<K,V> extends HashMap.Node<K,V> { Entry<K,V> before, after; Entry(int hash, K key, V value, Node<K,V> next) { super(hash, key, value, next); } }
-
-
- 插入的节点中包括一个 before ,after,分别执行他的前一个节点和后一个节点,(按插入循序指向),所有LinkedHashSet唯一的不同就是节点之间有了顺序;还包括一个next执行链表中的下一个节点
-
package com.model.collection.set.linkedhashset; import java.util.*; /** * @Description:测试类 * @Author: 张紫韩 * @Crete 2021/6/13 16:04 */ public class LinkedHashSetDemo01 { public static void main(String[] args) { LinkedHashSet linkedHashSet=new LinkedHashSet(); linkedHashSet.add("abc"); linkedHashSet.add("123"); linkedHashSet.add("456"); linkedHashSet.add("abc"); linkedHashSet.add("789"); linkedHashSet.add("000"); System.out.println(linkedHashSet); /** *1. LinkedHashSet加入顺序和取出元素/数据的顺序一致 *2. LinkedHashSet底层维护的是一个LinkedHashMap (是HashMap的 子类) *3. LinkedHashSet底层结构( 数组tabLe+双向链表) *4. 添加第次时,直接将 数组table扩容到16 ,存放 的结点类型是L inkedHashMap$Entry *5. 数组是HashMap$Node[] 存放的元素/数据是L inkedHashMap$Entry类型 * */ } }
-
-
LinkedHashSet课后习题
-
-
package com.model.collection.set.linkedhashset; import java.util.LinkedHashSet; import java.util.Objects; /** * @Description:测试类 * @Author: 张紫韩 * @Crete 2021/6/13 17:29 */ public class LinkedHashSetDemo02 { public static void main(String[] args) { LinkedHashSet<Object> hashSet = new LinkedHashSet<>(); //只有hash值相同且equals方法相同才认为是同一个对象,就不能加入,否则都会加入到数组中 hashSet.add(new Car("a", 100)); hashSet.add(new Car("a", 100)); hashSet.add(new Car("c", 100)); hashSet.add(new Car("b", 100)); hashSet.add(new Car("d", 100)); System.out.println(hashSet); } } class Car{ private String name; private int price; @Override public String toString() { return "Car{" + "name='" + name + '\'' + ", 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 price == car.price && Objects.equals(name, car.name); } @Override public int hashCode() { return Objects.hash(name, 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; } public Car(String name, int price) { this.name = name; this.price = price; } }
-