当前位置: 首页 > news >正文

HashSet

HashSet集合底层采取哈希表存储数据

哈希表是一种对于增删改查数据性能都较好的结构

hashCode方法和equals方法的配合流程

当添加对象的时候,会先调用对象的hashCode方法计算出一个应该存入的索引位置,查看该位置上是否存在元素

     不存在:直接存

     存在:调用equlas方法比较内容

                 false:存

                 true:不存

 @Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}

hashCode方法介绍

哈希值

是JDK根据某种规律算出来的int类型的整数

hashCode方法改造

重写hashCode方法

根据对象的属性值计算出的哈希值

Hashset原理解析

Hashset的添加过程

底层结构:哈希表(数组,链表,红黑树的结合体)

1.创建HashSet集合,内部会存在一个长度为16个大小的数组

2.调用的添加方法,会拿着对象的hashCode方法计算出应存入的索引位置(哈希值%数组长度)

3.判断索引位置元素是否是null

                         是:存入         不是:说明有元素,调用equals方法比较内容

对哈希值扰动,进行二次哈希操作,可以一定程度的减少链表挂载的数量

如何能够提高查询性能?

1.扩容数组

       扩容数组的条件:

A:当数组中的元素个数达到16*0.75(加载因子)=12

                                    扩容原数组2倍的大小

B:链表挂载的元素超过8(阈值)个,并且数组长度没有超过64

2.链表转红黑树

链表挂载的元素超过了8(阈值)个,并且数组长度到达了64

总结:

1.set集合的底层原理是什么样的

JDK8之前,哈希表:底层使用数组+链表组成

JDK8之后,哈希表:底层采用数组+链表+红黑树组成

2.哈希表的详细流程

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

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

    3.判断当前位置是否为null,如果是null直接存入,如果位置不为null,表示有元素,则调用equals方法比较属性值,如果一样,则不存,如果不一样,则存入数组

    4.当数组存满到16*0.75=12时,就会自动扩容,每次扩容原先的两倍

    5.当链表挂载元素超过8个(阈值)

             检查数组长度:

                             没有到达64,扩容数组

                             到达了64,会转换为红黑树

 

http://www.lryc.cn/news/141956.html

相关文章:

  • Java-继承和多态(下)
  • Docker搭建并配置Prometheus
  • “解放 Arweave“优惠:4EVERLAND的无缝上传教程
  • 系统学习Linux-LVS集群
  • 使用matplotlib绘制动图
  • 加油站ai视觉分析检测预警
  • Docker构建镜像
  • 【太多网工对NAT还存在这4种误解!你是其中一个吗?】
  • React钩子函数之useEffect,useLayoutEffect与useInsertionEffect的区别
  • Unity——后期处理举例
  • PMP P-05 Quality Management
  • vue中css修改滚动条样式
  • uniapp的H5实现图片长按保存
  • Java 8:Stream API 流式操作(学习)
  • 04_20 直接使用代码 创建内核模块获取物理内存信息
  • <C++> STL_list
  • 聚类分析 | MATLAB实现基于FCM模糊C均值聚类结果可视化
  • C++笔记之设计模式:setter函数、依赖注入
  • Spring MVC详解
  • 谷歌公开.zip域名,应采取哪些措施应对可能的安全风险?
  • css3滤镜属性filter让网页变黑白
  • C++教程 - How to C++系列专栏第5篇
  • Vue2向Vue3过度核心技术插槽
  • vite配置electron、ElementPlus或者AntDesignVue
  • 时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化
  • 强化学习系列--时序差分学习方法(SARSA算法)
  • 深度学习9:简单理解生成对抗网络原理
  • adb shell setprop 、开发者选项
  • 性能测试面试问题,一周拿3个offer不嫌多
  • Android Bitmap压缩