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

Map和Set

Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。数据的一般查找方式有两种:直接遍历和二分查找。但这两种查找方式都有很大的局限性,也不便于对数据进行增删查改等操作。对于这一类数据的查找,Map和Set显然是个好的选择。

Map中存储的是键值对(key和value),即每一个key都有一个对应的value值,多个key可以有同一个value,但key只能有一个。Set中只存储键(key)。

Set即数学上的集合,继承于Collection接口;Map则属于一个单独的接口。

Java中实现Set接口的常用类有TreeSet和HashSet;实现Map接口的常用类有TreeMap和HashMap。

TreeMap底层是一颗红黑树(近似平衡的二叉搜索树),搜索或修改数据的时间复杂度为O(log2N)。TreeMap存储的数据为关于Key有序的,搜索或修改数据也通过比较实现。

HashMap底层是哈希桶,获取或者操作数据的时间复杂度为O(1)。其存储的数据无序。

TreeMap的key不可以为null,HashMap的key和value都有可以为null。

TreeSet和HashSet与上述相同,其底层通过TreeMap和HashMap实现。

由于TreeMap的时间复杂度高于HashMap,只要不要求有序,一般都使用HashMap。HashMap的存储方式其实是通过某个函数得出的值直接存放在Hash表中相应地址处。搜索时通过相同的函数拿到相应数据。

哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称为哈希表(HashTable)(或者称散列表)。

不管怎么设计哈希函数,总有可能有两个不一样的值计算得出相同的地址。这时就引起了哈希冲突。冲突是必然的,但应尽可能地减少冲突。

冲突较多可能是由于hash函数的设计不合理造成的,因此设计哈希函数是应该遵循一定的规则:

  • 定义域必须包括所有需要存放的值
  • 存放的地址空间应该尽可能均匀
  • 哈希函数应该比较简单

常见hash函数有:直接定制法除留余数法、平方取中法、随机数法、数学分析法等。其中直接定制法(Hash(key) = A * key + B)和除留余数法(Hash(key) = key % p(p < m),m为分配的空间大小)比较常用。key可以通过hashCode()函数计算得出。

当然,Hash函数设计的再巧妙,也无法避免冲突。当冲突率很高时,需要降低负载因子,负载因子定义为:填入表中的元素 / 哈希表长度。

因此降低冲突的做法应为增加数组的长度。

为了解决冲突问题,可以采用开放定址法。即当发生冲突时,如果哈希表未满,则放到下一个地址并存放。具体做法为线性探测法和二次探测法:

线性探测即当发生冲突时,就存放在冲突位置的下一个地址(如果也冲突就继续后放)。但这样会造成数据集中在某一片区域。此时可以采用二次探测,当发生冲突时,找下一个空位置的方法为:Hi = (H0 + i^2) % m。

除此之外可以采用链地址法,即哈希桶。把所有产生冲突的数据放在一个子集中,称为一个桶,各个数据通过链表连接。当冲突严重时,子集中数据较多,也可以把子集转换为哈希表或搜索树。

在Java中,当冲突严重时,HashSet和HashMap中的链表会转换成红黑树。

key虽然可以通过hashCode()计算得出,但不同的key有可能得到相同的hashCode,因此要确定key值是否相同还需要通过equals判断。

如果要用自定义类作为 HashMap 的 key 或者 HashSet 的值,则必须覆写 hashCode 和 equals 方

法,而且要做到 equals 相等的对象,hashCode 一定是一致的。即:

相关文章:

Map和Set

Map和set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。数据的一般查找方式有两种&#xff1a;直接遍历和二分查找。但这两种查找方式都有很大的局限性&#xff0c;也不便于对数据进行增删查改等操作。对于这一类数据的查找&…...

【位运算问题】Leetcode 136、137、260问题详解及代码实现

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…...

同花顺2023届春招内推

同花顺2023届春招开始啦&#xff01; 同花顺是国内首家上市的互联网金融信息服务平台&#xff0c;如果你对互联网金融感兴趣&#xff0c;如果你有志向在人工智能方向发挥所长&#xff0c;如果你也是一个激情澎湃的小伙伴&#xff0c;欢迎加入我们&#xff01;岗位类别&#xf…...

深入Kafka核心设计与实践原理读书笔记第三章消费者

消费者 消费者与消费组 消费者Consumer负责定于kafka中的主题Topic&#xff0c;并且从订阅的主题上拉取消息。与其他消息中间件不同的在于它有一个消费组。每个消费者对应一个消费组&#xff0c;当消息发布到主题后&#xff0c;只会被投递给订阅它的消费组的一个消费者。 如…...

IDEA 中使用 Git 图文教程详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

【Linux系统】进程概念

目录 1 冯诺依曼体系结构 2 操作系统(Operator System) 概念 设计OS的目的 定位 总结 系统调用和库函数概念 3 进程 3.1 基本概念 3.2 描述进程-PCB 3.2 组织进程 3.3 查看进程 3.4 通过系统调用获取进程标示符 3.5 进程状态 在了解进程概念前我们还得了解下冯诺…...

上课睡觉(2023寒假每日一题 4)

有 NNN 堆石子&#xff0c;每堆的石子数量分别为 a1,a2,…,aNa_1,a_2,…,a_Na1​,a2​,…,aN​。 你可以对石子堆进行合并操作&#xff0c;将两个相邻的石子堆合并为一个石子堆&#xff0c;例如&#xff0c;如果 a[1,2,3,4,5]a[1,2,3,4,5]a[1,2,3,4,5]&#xff0c;合并第 2,32…...

【Selenium学习】Selenium 中常用的基本方法

1&#xff0e;send_keys 方法模拟键盘键入此方法类似于模拟键盘键入。以在百度首页搜索框输入“Selenium”为例&#xff0c;代码如下&#xff1a;# _*_ coding:utf-8 _*_ """ name:zhangxingzai date:2023/2/13 form:《Selenium 3Python 3自动化测试项目实战》 …...

python练习——简化路径

项目场景&#xff1a; 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 /开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表示当前目录本…...

2023新华为OD机试题 - 火星文计算2(JavaScript) | 刷完必过

火星文计算 2 题目 已知火星人使用的运算符号为#;$ 其与地球人的等价公式如下 x#y=4*x+3*y+2 x$y=2*x+y+3 x y是无符号整数 地球人公式按照 c 语言规则进行计算 火星人公式中#符优先级高于$ 相同的运算符按从左到右的顺序运算 输入 火星人字符串表达式结尾不带回车换行 输入…...

前端插件重磅来袭

“你值得拥有”专栏系列上新啦&#xff0c;今日推出“手写前端插件”项目&#xff0c;作为一个前端中高级工程师&#xff0c;手写前端树形菜单插件、弹出层插件、日历插件、分页插件、选项卡插件、进度条插件等是必备的技能&#xff0c;让你的前端技术百尺竿头更进一步&#xf…...

深入工厂|高精密多层板是如何被智造出来的?

或许有很多人从网络上见过各种教程&#xff0c;告诉你单层板是什么&#xff0c;多层板是什么&#xff0c;他们该如何做出来&#xff0c;但是在具体制造时却全凭想象&#xff0c;今天&#xff0c;就让我们来实地看看&#xff0c;精密的多层板是如何被制造出来的&#xff01;今天…...

代理模式动态代理

什么是代理模式&#xff1f; 代理模式是开发中常见的一种设计模式&#xff0c;使用代理模式可以很好的对程序进行横向扩展。代理&#xff0c;顾名思义就是一个真实对象会存在一个代理对象&#xff0c;并且代理对象可以替真实对象完成相应操作&#xff0c;外部通过代理对象来访…...

Mysql之二进制日志

目录 二进制日志 12-37 二进制日志格式 基于行的二进制日志 基于语句的二进制日志 混合格式二进制日志 复制日志 12-42 故障安全 (Crash-Safe) 复制 多源复制 二进制日志 12-37 二进制日志&#xff1a; • 包含数据和模式更改及其时间戳 – 基于语句 或 基于行 的日志…...

kail工具的使用--- cewl

1.介绍 Cewl是一款采用Ruby开发的应用程序&#xff0c;可以给他的爬虫指定URL地址和爬取深度&#xff0c;还可以添加外部链接&#xff0c;接下来Cewl会给你返回一个字典文件&#xff0c;你可以把字典用到类似John the Ripper这样的密码破解工具中。 2.使用 输入以下命令之后…...

【蓝桥杯集训1】前缀和专题(2 / 5)

目录 前缀和模板 &#xff01;3956. 截断数组 - 前缀和枚举 前缀和模板 活动 - AcWing import java.util.*;class Main {static int N100010;static int[] anew int[N],snew int[N];public static void main(String[] args){Scanner scnew Scanner(System.in);int nsc.nex…...

基于模块联邦的微前端实现方案

一、 微前端应用案例概述 当前案例中包含三个微应用&#xff0c;分别为 Marketing、Authentication 和 Dashboard Marketing&#xff1a;营销微应用&#xff0c;包含首页组件和价格组件 Authentication&#xff1a;身份验证微应用&#xff0c;包含登录组件 Dashboard&#x…...

【单目标优化算法】食肉植物优化算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

ANTLR4入门学习(四)

ANTLR4入门学习&#xff08;四&#xff09;一、设计语法1.语法2.ANTLR核心标记3.常见计算机语言模式4.左右递归5.识别常见的语法结构5.1 匹配标识符5.2 匹配数字5.3 匹配字符串常量5.4 匹配注释和空白字符5.5 基础的语法规则5.6 划定词法分析器和语法分析器的界线一、设计语法 …...

Android okhttp3中发送websocket消息,并通过mockwebserver将一个安卓设备模拟成服务器接发消息

websocket 提供了客户端和服务端的长链接&#xff0c;允许客户端和服务端双向发送消息 okhttp 提供了使用websocket 相关接口议。同时为方便单元测试&#xff0c;又提供了mockwebserver可以把一个安卓客户端作为服务端接受消息。 websocket使用 权限 <uses-permission an…...

PUBG玩家必看:如何用罗技鼠标宏实现精准无后座力射击

PUBG玩家必看&#xff1a;如何用罗技鼠标宏实现精准无后座力射击 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在《绝地求生》中总感觉压…...

告别手动开关!用ESP8266+Arduino实现高精度定时(误差<1秒)的智能插座方案

告别手动开关&#xff01;用ESP8266Arduino实现高精度定时&#xff08;误差<1秒&#xff09;的智能插座方案 在智能家居和物联网项目中&#xff0c;定时控制是最基础却最常被忽视的功能之一。许多开发者都遇到过这样的尴尬&#xff1a;用手机App远程控制电器很方便&#xff…...

如何在5分钟内完成BepInEx安装:游戏插件框架终极指南

如何在5分钟内完成BepInEx安装&#xff1a;游戏插件框架终极指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一款功能强大的游戏插件框架&#xff0c;专为Unity Mono…...

开源图表实时编辑器:从代码到可视化的无缝创作解决方案

开源图表实时编辑器&#xff1a;从代码到可视化的无缝创作解决方案 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-edito…...

WinMD:跨平台存储架构的突破性实现与Windows访问Linux RAID解决方案深度解析

WinMD&#xff1a;跨平台存储架构的突破性实现与Windows访问Linux RAID解决方案深度解析 【免费下载链接】winmd WinMD 项目地址: https://gitcode.com/gh_mirrors/wi/winmd 在当今混合IT环境中&#xff0c;Windows访问Linux RAID已成为系统管理员和技术决策者面临的关键…...

如何快速集成KYGooeyMenu:iOS粘液菜单的完整实现指南

如何快速集成KYGooeyMenu&#xff1a;iOS粘液菜单的完整实现指南 【免费下载链接】KYGooeyMenu A not bad gooey effects menu. 项目地址: https://gitcode.com/gh_mirrors/ky/KYGooeyMenu KYGooeyMenu是一款为iOS应用打造的粘液效果菜单组件&#xff0c;能为你的应用添…...

Postmate部署实战:从开发到生产的完整流程

Postmate部署实战&#xff1a;从开发到生产的完整流程 【免费下载链接】postmate &#x1f4ed; A powerful, simple, promise-based postMessage library. 项目地址: https://gitcode.com/gh_mirrors/po/postmate Postmate是一个强大的、简单的、基于Promise的postMess…...

Visual C++运行库全家桶:一站式解决Windows软件兼容性问题的终极方案

Visual C运行库全家桶&#xff1a;一站式解决Windows软件兼容性问题的终极方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 还在为"应用程序无法启动&qu…...

别再折腾源码编译了!Ubuntu 22.04 LTS下用apt-get一键部署Asterisk PBX(附SIP账号配置详解)

别再折腾源码编译了&#xff01;Ubuntu 22.04 LTS下用apt-get一键部署Asterisk PBX&#xff08;附SIP账号配置详解&#xff09; 在开源通信领域&#xff0c;Asterisk作为功能最强大的PBX系统之一&#xff0c;长期困扰初学者的不是其丰富的功能&#xff0c;而是复杂的编译安装过…...

群晖相册AI识别深度解析:无GPU设备开启人脸识别的技术方案

群晖相册AI识别深度解析&#xff1a;无GPU设备开启人脸识别的技术方案 【免费下载链接】Synology_Photos_Face_Patch Synology Photos Facial Recognition Patch 项目地址: https://gitcode.com/gh_mirrors/sy/Synology_Photos_Face_Patch Synology Photos Face Patch 是…...