Java--集合--LinkedHashSet

  1. LinkedHashSet全面说明
  2. 底层机制示意图

  3.  源码分析

    1.  LinkedHashSet加入顺序和取出元素/数据的顺序一致

    2.  LinkedHashSet底层维护的是一个LinkedHashMap (是HashMap的 子类)(数组 + 双向链表)

      1.   
    3.  LinkedHashSet底层结构( 数组tabLe+双向链表)
    4.  添加第次时,直接将 数组table扩容到16 ,存放 的结点类型是LinkedHashMap$Entry

      1.   
    5.  数组是HashMap$Node[] 存放的元素/数据是LinkedHashMap$Entry类型
      1.  
      2. 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);
                }
            } 
      3.  
    6. 插入的节点中包括一个 before ,after,分别执行他的前一个节点和后一个节点,(按插入循序指向),所有LinkedHashSet唯一的不同就是节点之间有了顺序;还包括一个next执行链表中的下一个节点
    7. 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类型
               * */
      
          }
      }

       

  4. LinkedHashSet课后习题
    1.  

       

    2. 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;
          }
      }

       

       

        

       

       

        
posted @ 2021-06-13 17:36  张紫韩  阅读(82)  评论(0编辑  收藏  举报