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

Set系列的公共特点:无重复、无索引,不可用普通for循环,API和Collection重复

HashSet:采取哈希表存取数据

哈希表组成?

JDk8之前:数组+链表, JDK8以后:数组+链表+红黑树

哈希值?

利用HashCode方法计算出来的对象的int表达形式,哈希值的作用是,根据对象的哈希值计算出在数组中的存放的索引位置,如下图公式,这样存取都很快,hashCode默认是通过对象内存地址映射过来的

利用哈希值计算在数组中的位置?

哈希值的特点?

何时以及为什么要重写hashcode和equals方法?

当对象是String,Integer时不需要重写,源码已经重写了;

当集合中存储的对象为自定义对象,必须重写hashCode和equals方法!!!

因为hashCode默认是通过对象内存地址映射过来的,我们想要用属性值来计算哈希值,所以重写

因为equals默认比较的是地址值,我们想要比较的是内部属性值,同时,重写equals也是防止哈希冲突造来的影响,所以重写。

HashSet添加元素过程在JDK8以前的底层原理?

1、首先自动创建一个默认长度16,默认加载因子为0.75(扩容时机)的数组table

2、调用hashcode方法,根据元素的哈希值和数组长度计算出要存入的位置

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

4、如果非空,调用equals方法比较属性值

5、一样的话不存,不一样的话代替老元素存入数组位置,并将老元素挂在新元素下面,形成链表

HashSet添加元素过程在JDK8以后的底层原理?

1,2,3,4和JDK8以前一样

5、一样的话不存,不一样的话老元素不动,并将新元素挂在老元素下面,形成链表

扩容时机?

元素会越存越多,当存入16*0.75=12个元素时,数组会扩容到原先2倍,16——32.

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

在JDK8以后,数组+链表+红黑树。

HashSet的几个问题?

1、HashSet存和取顺序为何不同?

存入位置是靠哈希值确定的,所以存入的顺序和元素在数组中的顺序无关;在取的时候,从默认数组table的0索引位进行遍历,但是,这个遍历位置和存入顺序无关,无法确定他是否是第一个存入的。

2、HashSet为什么没有索引?

因为在哈希表中可能存在链表,数组的一个索引只能代表一条链表,而链表上存在许多元素,无法表示出来这些元素的索引。因为底层的结构不唯一,结构太多导致于确定索引比较困难,所以舍弃了索引机制

3、HashSet利用什么保证数据去重?

利用Hashcode得到哈希值,获取元素在数组中的位置;然后利用equals比较对象属性值是否相同

4、HashSet的底层数据结构?

JDk8之前:数组+链表, JDK8以后:数组+链表+红黑树

5、HashSet好处

用Hashset写数据校验很方便,通过add的返回值判断数据有无重复然后返回不同的提示

LinkedHashset:有序——存入和取出顺序相同

利用双向链表记录存储顺序,从而达到有序

如果要用数据去重,用HashSet还是LinkedHashSet?

因为linkedHashset在Hashset基础上多做了事情,效率较低

TreeSet:可排序

1、什么是可排序?

 可以按照元素的默认规则(由小到大)进行排序

2、默认排序规则是什么?(数值)

遇到字符串组合情况,一位一位的对应比较ASCII码表:

3、TreeSet集合底层数据结构是什么?

基于红黑树的数据结构实现排序的,增删改查性能都较好

4、除了普通for遍历不可以使用,其他均可以遍历

5、非默认的排序规则(2种):存储的对象为自定义对象

第一种:重写Comparable接口中的抽象方法(默认)

例子:创建自定义学生对象,并按照年龄大小排序

在不进行任何操作下,直接add学生对象:系统报错,因为无法按照规则排序

进行重写方法:

重写Comparable接口中的抽象方法的具体原理:o表示已有的数据,this为插入数据

按照add的顺序,构造红黑树,按照红黑树的红黑规则

看看TreeSet如何进行的排序:

对重写Comparable接口中的抽象方法进行打印this和o:

结果:

add的顺序:

可以看出o就是红黑树原来存储的元素,this为新添加的元素,添加过程按照红黑树的红黑规则

第二种:创建TreeSet对象时,传递比较器Comparator指定规则

格式?

何时使用?

在第一种方法不满足要求后使用,比如字符串String已经默认重写了Compareto方法,如果我们不想按照默认方法,但又不方便修改源码,则需要利用这种方法来重新定义排序规则,两种方法同时存在时,听比较器Comparator的指定规则。

例题1:TreeSet对象排序,string数据类型,按长度排序(非默认)

如果要降序排列:return -i;

TreeSet小结

6、TreeSet无需重写hashCode和equals方法,不依托哈希表

7、各种set实现类怎么选择使用?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/856886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单高效的盈利策略,昂首资本推荐价格行为交易

有没有这样一种简单高效的盈利策略,不仅易于新手掌握,也是专业人士的常用利器?当然有了,就是Anzo Capital昂首资本今天推荐的价格行为交易。价格行为交易以其透明清晰的市场视角受到交易员的青睐,它如实反映了市场的真实动态&…

Ubuntu下安装docker

一、docker安装说明 解决官方源无法下载的问题 二、使用步骤 1.更新软件包索引 sudo apt-get update2.安装必要的软件包,以允许apt通过HTTPS使用仓库 sudo apt-get install apt-transport-https ca-certificates curl software-properties-common3.添加Docker的…

功能测试 之 单模块测试----购物车模块

1.需求分析 (1)购物车显示 1.若未登录,提示登录,提示文案“购物车内暂时没有商品,登录后将显示您之前加入的商品” 2.若已登录,购物车没有商品,提示去购物。 未登录状态 已登录状态 3.购物车有…

CVPR2024|UniPAD:一种自动驾驶的统一的预训练范式

本文章仅用于学术分享 论文标题丨 UniPAD: A Universal Pre-training Paradigm for Autonomous Driving 论文地址丨 https://arxiv.org/abs/2310.08370 代码地址 | https://github.com/Nightmare-n/UniPAD 关注「AI前沿速递」公众号,获取更多前沿资讯 01总览 这…

Spring Clude 是什么?

目录 认识微服务 单体架构 集群和分布式架构 集群和分布式 集群和分布式区别和联系 微服务架构 分布式架构&微服务架构 微服务的优势和带来的挑战 微服务解决方案- Spring Cloud 什么是 Spring Cloud Spring Cloud 版本 Spring Cloud 和 SpringBoot 的关系 Sp…

「51媒体」食品展览展会活动,媒体邀约资源有哪些?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 食品展览展会活动在媒体邀约方面拥有丰富的资源,可以吸引各类媒体的关注和报道。以下是一些常见的媒体邀约资源: 1. 行业媒体: 专业食品杂志&#xff…

可编程非线性RCD负载原理与应用

可编程非线性RCD负载(Resistor-Capacitor-Diode)是一种电子元件,其电阻、电容和二极管的特性可以通过编程进行控制和调整。这种负载广泛应用于电力系统、通信设备、电子设备等领域,具有很高的实用价值。 RCD负载的基本原理是利用电…

超声波清洗机的优势到底有哪些?四款精良爆品总结安利,质量放心

眼镜是现代人生活中的必备物品,但是很多人可能对于如何正确清洗眼镜感到困惑。传统的清洗方法可能会在清洗过程中对眼镜造成损坏,例如使用普通肥皂或清水清洗时容易划伤镜片。为了解决这个问题,家用眼镜超声波清洗机应运而生。超声波清洗机利…

[华为北向网管NCE开发教程(6)消息订阅

1.作用 之前介绍的都是我们向网管NCE发起请求获取数据,消息订阅则反过来,是网管NCE系统给我们推送信息。其原理和MQ,JMS这些差不多,这里不过多累述。 2.场景 所支持订阅的场景有如下,以告警通知为例,当我…

Talk|北京大学张嘉曌:NaVid - 视觉语言导航大模型

本期为TechBeat人工智能社区第602期线上Talk。 北京时间6月20日(周四)20:00,北京大学博士生—张嘉曌的Talk已经准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “NaVid - 视觉语言导航大模型”,NaVid是首个专为视觉语言导航&#xf…

深入理解Java并发锁

在Java中,并发锁是用来控制多个线程对共享资源的访问,确保数据的一致性和完整性。Java提供了多种并发锁机制,包括内置锁(synchronized)、显示锁(如ReentrantLock)、原子变量、并发容器以及一些高…

计算机考研|20所超高性价比院校,别错过!

这题我太会了,给大家推荐20所性价比非常高的计算机考研院校! 985和211都有,这些学校不搞歧视,公平竞争,非常有能力的同学报考。 ✅厦门大学 (985):不歧视双非,全靠实力,校园环境还…

vscode安装所需插件 个人记录版

vscode安装所需插件 个人记录版 仅做参考 设置

通信系统的最佳线性均衡器(2)---自适应滤波算法

本篇文章是博主在通信等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对通信等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在通信领域笔记:…

好用的便签是什么 电脑桌面上好用的便签

作为一名文字工作者,我经常需要在繁杂的思绪中捕捉灵感,记录下那些一闪而过的想法。在寻找一款适合电脑桌面的便签应用时,我偶然发现了敬业签便签软件简直是为我量身定制的,它不仅界面简洁,操作便捷,更重要…

`THREE.PointsMaterial` 是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性,比如颜色、大小和透明度。

demo案例 THREE.PointsMaterial 是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性,比如颜色、大小和透明度。下面是对其构造函数的参数、属性和方法的详细讲解。 构造函数 const material new THREE.PointsMaterial(parameters);参数&am…

阿里AI图片编辑新项目,人人都可做设计师。MimicBrush本地一键整合包下载

最近阿里巴巴联合香港大学开源了一个创新图像编辑工具:MimicBrush,这个工具相当于是一个局部重绘工具。它通过先进的AI技术,能够将一张图片的某一部分融合到另一张图片上。 MimicBrush,一款颠覆传统的图像编辑神器,不过…

深度学习 --- stanford cs231学习笔记四(训练神经网络的几个重要组成部分之一,激活函数)

训练神经网络的几个重要组成部分 一 1,激活函数(activation functions) 激活函数是神经网络之于线性分类器的最大进步,最大贡献,即,引入了非线性。这些非线性函数可以被分成两大类,饱和非线性函…

一站式家装服务管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,装修风格管理,主材管理,用户管理,基础数据管理 前台账户功能包括:系统首页,个人中心,装修风格&#xff0…

Chained Together卡顿严重怎么办 链在一起卡顿频繁的解决方法

链在一起/Chained Together这款游戏特别适合四个人一起玩,游戏里四个玩家将会被锁链“链在一起”,然后一起在各个地图闯关,不仅考验玩家们的默契配合,还考验智慧和勇气。在链在一起中,玩家需要根据地形和岩浆的分布情况…