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总览 这…

C++ 连续子数组的最大乘积

描述 输入一个长度为n的整型数组nums,数组中的一个或连续多个整数组成一个子数组。求所有子数组的乘积的最大值。 1.子数组是连续的,且最小长度为1,最大长度为n 2.长度为1的子数组,乘积视为其本身,比如[4]的乘积为4…

Spring Clude 是什么?

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

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

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

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

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

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

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

【Unity动画系统】Amimator Controller的概念及其使用示例

Unity的Animator Controller是动画系统中的一个核心组件,它负责管理和控制动画状态机(Animation State Machine)的行为。Animator Controller包含了动画状态、转换规则、以及用于控制动画流程的参数。 Animator Controller的概念&#xff1a…

python开发自己的模块

创建并发布你自己的 Python 模块是一项非常有用的技能,可以让你分享代码,并在不同项目中重用它。以下是一个完整的流程,展示如何创建、测试、打包并发布一个 Python 模块。 1. 创建你的模块 首先,创建一个目录结构来存放你的模块…

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

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

python从入门到精通1:注释

在Python编程中,注释是一种非常重要的工具,它不仅可以帮助我们记录代码的目的、工作方式以及任何需要注意的地方,还可以使代码更具可读性。Python提供了两种主要的注释方式:单行注释和多行注释。下面我们将深入探讨这两种注释方式…

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

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

java 接口的编写

在Java中,接口是一种定义行为的规范,可以被类实现。接口中只定义方法的签名,没有方法的实现。下面是编写Java接口的步骤: 使用interface关键字定义一个接口。例如,如果要定义一个形状接口,可以写成如下形式…

【神经网络】基于对抗神经网络的图像生成是如何实现的?

对抗神经网络,尤其是生成对抗网络(GAN),在图像生成领域扮演着重要角色。它们通过一个有趣的概念——对抗训练——来实现图像的生成。以下将深入探讨GAN是如何实现基于对抗神经网络的图像生成的: 基本结构 生成器(Gener…

深入理解Java并发锁

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

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

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

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

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

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

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