红黑树、HashSet、LinkedHashSet底层原理

Set集合底层原理 在学习Set集合之前我们应该学习Collection接口中的常用方法。因为Set集合是Collection的子接口。也就是说当我们使用Set集合时,我们不仅可以使用Collection接口提供的所有操作,还可以使用Set接口提供的特殊操作。关于Collection提供的方法,在之前的List集合中我们已经说过了,这里不再说。 阅读详情

1. 数据结构(红黑树)

  • 红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。
  • 1972年出现,当时被称之为平衡二叉B树。后来,1978年被修改为如今的”红黑树"。
  • 它是一种特殊的二叉查找树,红黑树的每一个节点上都有存储位表示节点的颜色。
  • 每一个节点可以是红或者黑;红黑树不是高度平衡的,它的平衡是通过“红黑规则”进行实现的。

平衡二叉树: 

        高度平衡。

        当左右子树高度差超过1时,通过旋转保持平衡。

红黑树:

        是一个二叉查找树:
                但是不是高度平衡的。
                条件:特有的红黑规则。

1.1 数据结构(红黑树)红黑规则

        每一个节点或是红色的,或者是黑色的。

        根节点必须是黑色。

        如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的。

如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)。

        对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

1.2 数据结构(红黑树)添加节点的规则

默认颜色:添加节点默认是红色的(效率高)

 1.3 数据结构(红黑树)添加节点的规则

        红黑树在添加节点的时候,添加的节点默认是红色的。

2. HashSet

2.1 存储字符串并遍历

利用Set系列的集合,添加字符串,并使用多种方式遍历。

        迭代器

        增强for

        Lambda表达式

import java.util.HashSet;
import java.util.Set;

public class A01_SetDemo1 {
    public static void main(String[] args) {
       /*
           利用Set系列的集合,添加字符串,并使用多种方式遍历。
            迭代器
            增强for
            Lambda表达式

        */


        //1.创建一个Set集合的对象
        Set<String> s = new HashSet<>();

        //2,添加元素
        //如果当前元素是第一次添加,那么可以添加成功,返回true
        //如果当前元素是第二次添加,那么添加失败,返回false
        s.add("张三");
        s.add("张三");
        s.add("李四");
        s.add("王五");

        //3.打印集合
        //无序
        //System.out.println(s);//[李四, 张三, 王五]

        //迭代器遍历
       /* Iterator<String> it = s.iterator();
        while (it.hasNext()){
            String str = it.next();
            System.out.println(str);
        }
*/

        //增强for
       /* for (String str : s) {
            System.out.println(str);
        }*/

        // Lambda表达式
        s.forEach( str->System.out.println(str));


    }
}

2.2 HashSet底层原理

  •  HashSet集合底层采取哈希表存储数据
  •  哈希表是一种对于增删改查数据性能都较好的结构

2.3 哈希表组成

  • JDK8之前:数组+链表
  • JDK8开始:数组+链表+红黑树

2.4 哈希值

哈希值:对象的整数表现形式

  •  根据hashCode方法算出来的int类型的整数
  • 该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算
  • 一般情况下,会重写hashCode方法,利用对象内部的属性值计算哈希值

2.5 对象的哈希值特点

  • 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
  • 如果已经重写hashcode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的
  • 在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞)
public class A02_HashSetDemo1 {
    public static void main(String[] args) {
        /*
            哈希值:
                对象的整数表现形式
                1. 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
                2. 如果已经重写hashcode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的
                3. 但是在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞)

         */

        //1.创建对象
        Student s1 = new Student("zhangsan",23);
        Student s2 = new Student("zhangsan",23);

        //2.如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
        //  如果已经重写hashcode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的
        System.out.println(s1.hashCode());//-1461067292
        System.out.println(s2.hashCode());//-1461067292


        //在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。
        //哈希碰撞
        System.out.println("abc".hashCode());//96354
        System.out.println("acD".hashCode());//96354

    }
}

2.6 HashSetJDK8以前底层原理

        创建一个默认长度16,默认加载因为0.75的数组,数组名table

        根据元素的哈希值跟数组的长度计算出应存入的位置

        判断当前位置是否为null,如果是null直接存入

        如果位置不为null,表示有元素,则调用equals方法比较属性值

        一样:不存           不一样:存入数组,形成链表

                JDK8以前:新元素存入数组,老元素挂在新元素下面

                JDK8以后:新元素直接挂在老元素下面

        int index=(数组长度-1)& 哈希值

2.7 HashSet底层原理

        JDK8以后,当链表长度超过8,而且数组长度大于等于64时,自动转换为红黑树

        如果集合中存储的是自定义对象,必须要重hashCode和equals方法

利用HashSet集合去除重复元素

        需求:创建一个存储学生对象的集合,存储多个学生对象。

        使用程序实现在控制台遍历该集合。

        要求:学生对象的成员变量值相同,我们就认为是同一个对象。

import java.util.HashSet;
public class A03_HashSetDemo2 {
    public static void main(String[] args) {
        /* 需求:创建一个存储学生对象的集合,存储多个学生对象。
            使用程序实现在控制台遍历该集合。
            要求:学生对象的成员变量值相同,我们就认为是同一个对象


        String   Integer
*/
        //1.创建三个学生对象
        Student s1 = new Student("zhangsan",23);
        Student s2 = new Student("lisi",24);
        Student s3 = new Student("wangwu",25);
        Student s4 = new Student("zhangsan",23);


        //2.创建集合用来添加学生
        HashSet<Student> hs = new HashSet<>();

        //3.添加元素
        System.out.println(hs.add(s1));
        System.out.println(hs.add(s2));
        System.out.println(hs.add(s3));
        System.out.println(hs.add(s4));

        //4.打印集合
        System.out.println(hs);
    }
}
import java.util.HashSet;
public class A03_HashSetDemo2 {
    public static void main(String[] args) {
        /* 需求:创建一个存储学生对象的集合,存储多个学生对象。
            使用程序实现在控制台遍历该集合。
            要求:学生对象的成员变量值相同,我们就认为是同一个对象


        String   Integer
*/
        //1.创建三个学生对象
        Student s1 = new Student("zhangsan",23);
        Student s2 = new Student("lisi",24);
        Student s3 = new Student("wangwu",25);
        Student s4 = new Student("zhangsan",23);


        //2.创建集合用来添加学生
        HashSet<Student> hs = new HashSet<>();

        //3.添加元素
        System.out.println(hs.add(s1));
        System.out.println(hs.add(s2));
        System.out.println(hs.add(s3));
        System.out.println(hs.add(s4));

        //4.打印集合
        System.out.println(hs);
    }
}

3. LinkedHashSet底层原理

        有序、不重复、无索引。

        这里的有序指的是保证存储和取出的元素顺序一致。

        原理:底层数据结构是依然哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序。

 

import java.util.LinkedHashSet;
public class A04_LinkedHashSetDemo {
    public static void main(String[] args) {
        //1.创建4个学生对象
        Student s1 = new Student("zhangsan",23);
        Student s2 = new Student("lisi",24);
        Student s3 = new Student("wangwu",25);
        Student s4 = new Student("zhangsan",23);


        //2.创建集合的对象
        LinkedHashSet<Student> lhs = new LinkedHashSet<>();


        //3.添加元素
        System.out.println(lhs.add(s3));
        System.out.println(lhs.add(s2));
        System.out.println(lhs.add(s1));
        System.out.println(lhs.add(s4));

        //4.打印集合
        System.out.println(lhs);
    }
}

车载以太网入坑指南,从小白到懂哥的进阶之路【技术分享】 各位技术大佬们好!最近公司项目涉及到车载以太网,刚开始完全懵逼,花了大半个月时间各种查资料、测试设备,总算是摸清了门道。想着互联网上卧虎藏龙,肯定有不少大佬对这个技术感兴趣,所以写个帖子分享一下,顺便求各位大佬指点。 阅读详情

相关推荐

GE Proficy Historian8.0历史数据库部署与配置全攻略

本文提供了GE Proficy Historian 8.0历史数据库的详细部署与配置指南。内容涵盖安装前的系统环境、权限与依赖检查,服务器安装的关键步骤与类型选择,采集器的安装配置与数据接入,以及客户端工具的使用与数据分析实战。旨在帮助用户规避常见陷阱,实现一次部署成功,构建稳定高效的工业数据归档平台。

silver的专栏 760

LinkedHashSet详解

LInkedHashSet这个容器不知道大家在平时的工作用的多吗,反正我基本上没有用过,所以,本文主要对于它的特点、使用场景、实现原理,做一个讲解,希望对大家平时的工作有所帮助。LinkedHashSet是一个基于LinkedHashMap实现的有序去重集合列表。LinkedHashSet中的元素没有重复LinkedHashSet中的元素有顺序,维护了添加顺序LInkedHashSet可以存储null值LinkedHashSet是一个线程不安全的容器。...

Chenhui98的博客 1万+

1.28寸圆屏LCD驱动开发:GC9A01与RT-Thread嵌入式实现

圆形TFT-LCD是一种面向可穿戴、IoT终端的紧凑型人机交互显示技术,其核心在于SPI/QSPI接口时序控制与GRAM内存映射原理。通过驱动芯片(如GC9A01)完成电源管理、伽马校正和MADCTL方向配置,可实现低功耗、高刷新率的图形渲染。该技术显著提升嵌入式设备的UI表现力与空间利用率,在智能手环、传感器节点、微型HMI等资源受限场景中具备突出工程价值。本文围绕1.28寸圆屏LCD模块,详解硬件接口规范、RT-Thread下QSPI驱动架构及Bresenham算法优化实践。

weixin_42599908的博客 154

38-LinkedHashSet集合

1.LinkedHashSet是HashSet的子类继承了HashSet 此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。 java.util.LinkHashSet 集合extends继承 HashSet集合 LinkHashSet集合特点 1.底层是一个哈希表(数组+链表/红黑树)+链表 (多的链表用来记录元素的存储顺序) LinkHashSet集合可以保证元素有序 .

shwjakak的博客 213

大疆M3508电机使用CAN通信进行速度PID闭环控制详解

目录一. 简介二. 电机通信协议三. 电机PID控制原理四. 官方代码移植-中断接收五. 官方代码移植-查询接收 一. 简介 之前写过一篇文章STM32实现四驱小车(五)电机控制任务——电机速度PID控制算法,其中是以大疆的M3508电机为例进行讲解的(没错,就是RoboMaster机器人同款电机,不过Robomaster上的电机好像是小一号的M2006)。不少小伙伴私信问我要代码,我都回复说不是有官方demo么。后来问的人多了我大概明白了,看来官方的Demo还是有点门槛。可能是带FreeRTOS操作系统看

qq_30267617的博客 7万+

NRF52832调试方法1——HardFault_Handler问题定位

一、遇到问题 keil debug模式下,直接点击全速运行(Run)发现程序卡死,点击stop按钮后,停到了HardFault_Handler位置,如下图所示。 此时使用navigate backwards(蓝色左箭头)是无效的,找不到程序卡在哪里。 二、解决办法 此时首先观察register窗口 若Stack为MSP,则复制R13(SP)的值到memory观察窗的地址搜索栏。每一行显示连续的28个地址上的存储信息,每个地址上存有一个字节。 从第21个位置起的连续四个字节是LR的值,

小梁的博客 3650

java集合进阶篇-《HashSet和LinkedHashSet详解》

HashSet集合和LinkHashSet集合都是Set集合的分支集合,语法大致相同。这些众多的集合虽然许多地方都十分相近,但是底层的原理还是大相径庭的。希望大家能够仔细分辨。在Java中,Set是一个不允许包含重复元素的集合。Set接口是Collection接口的子接口,它继承了Collection的所有方法,并且增加了对唯一性元素存储的支持。SetHashSet:这是最常用的Set实现类,它不保证元素的存储顺序。HashSet使用哈希表来存储其元素,因此查找元素非常快,但是不能存储重复的值。

欢迎大家一起讨论交流 993

【常见开源库的二次开发】基于openssl的加密与解密——openssl认识与配置(一)

OpenSSL 是一个开源的软件库,它提供了一系列加密工具和协议,主要用于实现安全通信,如在网络上的数据传输。它支持多种加密算法,包括对称加密、非对称加密、散列函数、伪随机数生成器、数字签名、密钥交换以及证书管理等。

嵌入式技术开发 4159

LinkedHashSet集合底层源码解析

提示:发文三个工作日后这里做全文总结提示:以下是本篇文章正文内容,下面案例可供参考LinkedHashSet是HashSet的实现子类,HashSet是数组加单向链表,LinkedHashSet是数组加双向链表,但是LinkedHashSet底层是一个LinkedHashMap。HashSet存入数据顺序和取出的顺序不一样,但每次遍历取出元素的顺序都是一样的。而LinkedHashSet存入和取出的顺序都是一样的。

无奈朝来寒雨晚来风 的博客 906

AgentScope Java 2.0 最佳实践:9 个完整示例手把手带你开发 Java‑Agent

本文基于9 个完整示例,深入剖析从基础对话(BasicChatExample)、工具调用(@Tool 注解)、结构化输出(POJO Schema)、ToolGroup 自主管理、MCP 外部工具集成、Hook 生命周期监控、Spring Boot SSE 流式 Web、JsonSession 会话持久化到中断恢复的全链路实战教程。

program哲学 1617

华为OD机考双机位C卷 - 文件存储系统的排序(Java & Python & JS & GO & C++ & C)

华为OD机考双机位C卷 - 文件存储系统的排序, 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 776

Java集合(七)LinkedHashSet

添加第一次时,直接将数组table扩容到16,存放的结点类型是LinkedHashMap$Entry,table是HashMap$Node内部类数组的这样子一个类型,但是他里面存放的真实的元素是LinkedHashMap$Entry这种类型,他们之间有继承或者实现关系,Entry继承或者实现了Node。(3)在添加一个元素时,先求hash值,在求索引,确定该元素在table的位置,然后将添加的元素加入到双向链表(如果已经存在,不添加【原则和hashset一样】)我们还可以进行查看head和tail。

超级程序诞生的博客 2231

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java集合之Set篇——HashSet、LinkedHashSet、TreeSet的底层源码解析

上一节结束了java集合的List篇java集合之List篇——ArrayList补充和Vector、LinkedList的底层源码-优快云博客本节说一下Set篇——HashSet、LinkedHashSet、TreeSet的底层源码解析实现Comparable接口// 自定义类 Person 实现 Comparable 接口// 构造函数// Getter 方法return age;// 重写 compareTo 方法@Override// 按年龄升序排列。

2202_75483664的博客 1458

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

HashSet、LinkedHashSet 和 TreeSet的底层原理

本文分析了Java中HashSet、LinkedHashSet和TreeSet三种Set实现的底层原理。HashSet基于HashMap实现,使用哈希表存储元素,具有无序特性,操作时间复杂度为O(1)。LinkedHashSet继承HashSet但使用LinkedHashMap,通过双向链表维护插入顺序,适合需要保持顺序的场景。TreeSet基于TreeMap实现,采用红黑树结构,元素自动排序并提供范围查询功能,操作时间复杂度为O(logn)。

2502_94251649的博客 847

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JAVASE进阶:Collection高级(3)——HashSet、LinkedHashSet底层原理

JAVASE进阶:Collection高级(3)——HashSet、LinkedHashSet底层原理

m0_52380556的博客 883

Java中HashSet、LinkedHashSet和TreeSet的底层原理

Java中的HashSet的底层原理主要基于哈希表(HashMap)来实现。HashSet内部使用哈希表(实际上是一个HashMap的实例)来存储元素。哈希表由一个数组(桶)和多个链表(或红黑树,在Java 8及以后版本中,当链表长度超过某个阈值时,会转换为红黑树)组成。当向HashSet中添加元素时,首先会计算该元素的哈希码(通过调用对象的hashCode()方法)。哈希码是一个整数,用于确定元素在哈希表中的位置。使用哈希码和哈希表的大小(即桶的数量)来计算元素应该存放在哪个桶中。

m0_72244040的博客 1758

底层实现红黑树_Set源码解析(红黑树)

之前粗略看了一下List和Map,今咱来聊一下Set。主要看以下几个:(1)HashSet(2)Collections.synchronizedSet(3)LinkedHashSet(4)CopyOnWriteArraySet(5)TreeSet一、HashSetHashSet是日常搬砖中最常用的,如果有了解过HashMap的实现,那么HashSet你也就理解了。(1)HashSet底层就是用Ha...

weixin_27059669的博客 228

java中HashSet,LinkedHashSet,TreeSet的相关内容

last()方法返回集合中的最后一个元素(即最大的元素)。set.add(5);// 输出: 20(集合中的最大元素)

gyijh的博客 1061

Java基础进阶—Set集合详解(HashSet、LinkedHashset、TreeSet看这一篇就够了)

LinkedHashSet是HashSet实现类的子类,该集合中的数据是有序的(指添加数据的顺序和获取数据的顺序一致)TreeSet实现类,该集合具有排序功能,向其中存入的数据默认按升序的顺序排序Set系列集合常用方法基本都是父接口Collection提供的,没有特有方法。

Future_yzx的博客 1217

Set集合系列——Set、HashSet、LinkedHashset、TreeSet

按照红黑树的红黑规则。

Eliaukgo的博客 926

1.数据结构(红黑树 红黑树规则 添加节点规则)2.set系列集合特点 实现类特点 3.HashSet底层原理 哈希值特点 4.LinKedHashset底层原理

1.数据结构(红黑树 红黑树规则 添加节点规则)2.set系列集合特点 实现类特点 3.HashSet底层原理 哈希值特点 4.LinKedHashset底层原理

m0_67911983的博客 155

1.6.HashSet,LinkedHashSet详解

LinkedHashSet集合比HashSet集合效率低,因为LinkedHashSet集合在哈希表的基础上又多做了一些事(操作数据顺序)。

ADCvbV的博客 1093

HashSet的底层实现原理、子类LinkedHashSet、排序TreeSet

1.HashSet的底层实现原理 HashSet底层使用了数组+链表来支持的,特点:存储快 HashSet存储对象的时候: 首先会先算出对象的哈希值,然后通过对哈希值的移位运算,算出元素在哈希表中的存储位置 如果当前存储的位置没有任何元素,那么就直接存储到这个位置上 如果算出的元素的存储位置已经有其他的元素了,那么就会对哈希值进行比较,,如果哈希值相同,就会使用equals方法判断两个元素是否相同,如果元素相同,就会equals就会返回false,不允许添加,如果返回的是false,就会在当前的位置以链表

小布のJava世界 655

Java Set 集合体系详解:HashSet、LinkedHashSet、TreeSet 全面解析

int score;// 按成绩排序@Override@Override集合类型底层结构是否有序是否允许重复是否允许 null排序方式线程安全HashSetHashMap否否是无否HashMap + 链表是(插入顺序)否是无否TreeSetTreeMap(红黑树)是(自动排序)否否自然 / 定制否。

alkamgg的博客 698

Set,hashSet,linkedHashSet,treeSet

哈希值就是一个int数值,java中每个对象都有一个哈希值Java中的对象,都可以调用object类提供的hasgCode方法,返回该对象的哈希值对象哈希值的特点同一个对象多次调用的hashCode()方法的哈希值是相同的不同的对象,哈希值一般不相同,但是也是可能会相同(哈希碰撞)[因为int表达范围是-21亿到+21亿]提问:set有索引吗?5. set 的底层是数组加链表,是有索引的,但是完美用不了。

weixin_51625248的博客 91

day12 【set、HashSet、LinkedHashSet、TreeSet、综合练习】上课

1.Set集合介绍(掌握) 特点: 1.存取无序 2.数据唯一 3.不能使用索引操作 位于java.util包下的,使用需要导包 Set集合中的方法和Collection集合中的方法一样,没有特有的方法 Set接口的子类: HashSet重点 LinkedHashSet TreeSet 2.HashSet集合(必须掌握) 1.概念介绍 HashSet集合底层其实是后面学习的HashMap集合,而HashMap集合底层是哈希表 HashSet集合能够保证数据唯一 存取无序都是由

weixin_43525993的博客 264
上一篇: 二叉树、二叉查找树、平衡二叉树
下一篇: 安装Docker
全聚德一级码师
博客等级 码龄4年 501粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值