首页 > 编程语言 >7-LinkedHashSet底层结构和源码分析

7-LinkedHashSet底层结构和源码分析

时间:2024-07-12 18:20:16浏览次数:14  
标签:LinkedHashSet name Car price 链表 源码 linkedHashSet 底层

7-LinkedHashSet底层结构和源码分析

介绍汇总:

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

1-LinkedHashSet全面说明

  1. LinkedHashSet 底层是一个 LinkedHashMap ,底层维护了一个数组 + 双向链表 。由于 LinkedHashMap 是继承 HashMap 的所有特性的,其双向链表是在原本的数据结点上加上了 before 和 after 指针,并且也不破坏原来 HashMap 中链表和红黑树的结构,来完成实现双向链表的。
  2. LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,同时使用链表维护元素的次序,这就保证元素看起来是以插入顺序保存的。
  3. LinkedHashSet 不允许添加重复元素,这点与 HashSet 一致。

2-LinkedHashSet底层机制说明

  1. 在 LinkedHashSet 中维护了一个 hash 表和双向链表( LinkedHashSet (LinkedHashMap) 有 head 和 tail )
  2. 每一个数据结点在原本的基础上(通过继承 HashMap 的数据结点 Node ,拥有 Node 所有特性)有 before 和 after 属性,这样就可以形成双向链表(before 和 after 属性类型为 Entry ,这个类是继承 Node,这也是为啥 LinkedHashSet 中表的类型为 Node,却可以存放 Entry 类型数据结点)
  3. 在添加一个元素时,先求 hash 值,再求索引;确定该元素在 table 的位置,然后将添加的元素加入到双向链表(若已存在,不添加【原则和 HashSet 一样】)
// 添加示意代码
tail.next = newElement
newElement.pre = tail
tail = newElement
  1. 这样的话,遍历 LinkedHashSet 也能确保插入顺序和遍历顺序一致

  2. LinkedHashSet 继承了 HashSet 的所有特性,并且基本上都是调用其父类的方法进行。而其内部是维护了一个 LinkedHashMap,并且 LinkedHashMap 也继承了 HashMap 的所有特性,并且扩容流程也是和父类一致或者就是直接调用父类的扩容流程,只是其中有一些关键类和方法进行了重写。例如,数据结点 Entry (继承 HashMap 的内部类 Node )。还有创建新数据结点方法 newNode 方法进行了重写,创建 Entry 结点,并且增加了维护的双向链表的增加机制。还有一个就是 newTreeNode 方法,创建好后树结点,进行链表添加,并且该 TreeNode 结点是继承了 Entry 所有特性。

  3. 最主要就是 LinkedHashSet 与 HashSet 多维护了双向链表,可以按添加顺序进行遍历。

  4. 当前仅是介绍了添加元素的底层。

  5. 实践练习

    1. 测试链表树化
    package set.linkedhashset;
    
    import java.util.LinkedHashSet;
    
    public class LinkedHashSetSource {
    
        @SuppressWarnings({"all"})
        public static void main(String[] args) {
    
            // 测试链表树化
            // 与 HashMap 中的树化流程基本一致,满足两个条件才可树化
            // 只是多了双向链表
    
            LinkedHashSet linkedHashSet = new LinkedHashSet();
    
            for (int i = 1; i <= 12 ; i ++) {
                linkedHashSet.add(new Pet(i)) ;
            }
        }
    }
    
    class Pet {
    
        private int n ;
    
        public Pet(int n) {
            this.n = n;
        }
    
    
        @Override
        public int hashCode() {
            return 100;
        }
    }
    
    
    1. 相同元素
    package set.linkedhashset;
    
    import java.util.LinkedHashSet;
    import java.util.Objects;
    
    public class LinkedHashSetExercise {
    
        @SuppressWarnings({"all"})
        public static void main(String[] args) {
    
            /**
             * Car 类(属性:name,price),若 name 和 price 一样,则认为是相同元素,就不能添加
             * 解题思路
             * 按一般不同对象肯定不同,首先肯定不同,因为其引用中存放的地址值不同
             * 所以要想通过字段来确认为相同元素,需要重写 equals 和 hashCode 方法
             * 为啥还要在重写 hashCode ,是为了保证equals方法和hashCode方法之间的一致性合约,
             * 即如果两个对象通过equals方法比较是相等的,那么这两个对象的hashCode方法也必须返回相同的整数值。
             * 这是从对象本身的角度出发,前边的练习从 HashMap 的相同元素的条件角度进行
             */
    
            LinkedHashSet linkedHashSet = new LinkedHashSet();
    
            linkedHashSet.add(new Car("奥拓",1000)) ;
            linkedHashSet.add(new Car("奥迪",300000)) ;
            linkedHashSet.add(new Car("法拉利",10000000)) ;
            linkedHashSet.add(new Car("奥迪",300000)) ;
            linkedHashSet.add(new Car("保时捷",70000000)) ;
            linkedHashSet.add(new Car("奥迪",300000)) ;
    
            System.out.println("====集合中元素有" + linkedHashSet + "====");
        }
    }
    
    class Car {
    
        private String name ;
    
        private double price ;
    
        public Car(String name, double price) {
            this.name = name;
            this.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 Double.compare(price, car.price) == 0 && Objects.equals(name, car.name);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(name, price);
        }
    
        @Override
        public String toString() {
            return "Car{" +
                    "name='" + name + '\'' +
                    ", price=" + price +
                    '}';
        }
    }
    
    

标签:LinkedHashSet,name,Car,price,链表,源码,linkedHashSet,底层
From: https://www.cnblogs.com/Yao-happy/p/18298087

相关文章

  • 网站源码软件下载pbootcms模板网页设计主题
    软件下载的网站设计分享我很高兴向大家介绍我刚刚制作的软件下载的网站设计。友好的站点界面,是打动访客的第一步。软件下载网站主题网站设计主要关注于提供用户一个便捷、安全、丰富的软件资源下载平台。以下是关于软件下载网站主题网站设计的详细介绍:1.首页设计布局清晰:......
  • 网站源码新能源pbootcms模板网页设计主题
    新能源的网站设计分享我很高兴向大家介绍我刚刚制作的新能源的网站设计。友好的站点界面,是打动访客的第一步。新能源网站主题设计是一个融合了创新、环保和科技元素的独特过程。以下是对新能源网站主题设计的详细介绍:一、设计理念新能源网站主题设计旨在传达公司或组织在新......
  • Java计算机毕业设计康养管理系统的设计与实现(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着人口老龄化的加速和社会对健康生活品质需求的日益增长,康养产业迎来了前所未有的发展机遇。传统的医疗护理模式已难以满足人们多元化、个性化的健......
  • Java计算机毕业设计高校多媒体教室管理系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着教育信息化的深入发展,高校多媒体教学已成为提升教学质量、丰富教学手段的重要手段。然而,传统的高校多媒体教室管理往往依赖于人工调度与维护,面临......
  • PixiJS源码分析系列: 第一章 从最简单的例子入手
    从最简单的例子入手分析PixiJS源码我一般是以使用角度作为切入点查看分析源码,例子中用到什么类,什么方法,再入源码。高屋建瓴的角度咱也做不到啊,毕竟水平有限pixijs的源码之前折腾了半天都运行不起来,文档也没有明确说明如何调式我在github上看到过也有歪果仁在问如何本地......
  • 网站源码装修设计pbootcms模板网页设计主题
    装修设计的网站设计分享我很高兴向大家介绍我刚刚制作的装修设计的网站设计。友好的站点界面,是打动访客的第一步。装修设计网站的主题网站设计需要注重用户体验、创意展示以及专业度,以便吸引潜在客户并展示公司的设计实力和服务质量。以下是对装修设计网站主题设计的详细介绍......
  • 海外短剧系统源码搭建(APP+H5)平台多语言系统
    为大家推荐一个非常好用的短剧系统,它可以搭建海外短剧多语言。这个海外短剧系统平台支持多种国家语言,后台管理一键翻译,系统自带7种语言,后台支持中文简体、中文繁体、英语、泰语、越南语、阿拉伯语、西班牙语、等等,后台管理想要什么语言随便加。讲一下推荐的优势:系统自带7种......
  • 连锁门店收银系统源码,可二次开发
    1.多样化线下收银如Windows版收银(exe安装包)、安卓版收银(apk安装包)、AI智能称重收银(exe/安卓安装包)、无人自助收银(apk安装包)、手机端收银(微信小程序版)、聚合码收银(小程序版)。2.收银端ui风格收银端ui风格,门店可以根据自己的喜好去自定义,如天空蓝、高端金、热情红、生鲜绿、......
  • pdf.js源码分析-字体加载流程
    pdf.js中的字体加载流程,下面演示一种Type1的字体的加载流程,会把一些兼容性的内容省去,只记录字体数据的加载过程中涉及到的方法和作用:evaluator.js->handleSetFont:操作符列表中加载字体evaluator.js->loadFont:加载字体的方法evaluator.js->preEvaluateFont:对字体信息进行......
  • 【java计算机毕设】线上花店销售商城系统java MySQL ssm JSP maven项目代码源码+文档p
    目录1项目功能2项目介绍3项目地址 1项目功能【java计算机毕设】线上花店销售商城系统MySQLssmJSPmaven项目代码源码+文档PPT小组设计代码 2项目介绍系统功能:线上花卉小铺系统包括管理员、用户俩种角色。用户端:1.注册登录:游客填写基础信息,注册成为小铺用......