数据结构与算法-【算法专项】Hash算法-2(HashMap+设计Hash+Hash应用+Hashmap常用方法)

数据结构与算法-Hash算法-2

  • 5 HashMap(又双叒叕提到红黑树动态扩容)
  • 6 如何设计Hash
  • 7 Hash的应用
  • 8 HashMap源码(又双叒叕)
    • 构造方法:
    • put方法:
    • get方法:
    • equals方法:
    • containsKey方法:
    • values方法:
    • entrySet方法:
    • hash方法(用于自定义对象作为键时):

5 HashMap(又双叒叕提到红黑树动态扩容)

由于链表这种结构确实存在一些缺点,所以在我们的JDK中对之进行了优化,引入了更高效的数据结构:红黑树

  1. 初始大小:HashMap默认的初始大小是16,这个默认值是可以设置的,如果事先知道大概的数据量有多大,可以通过修改默认初始大小,减少动态扩容的次数,这样会大大提高HashMap的性能。

  2. 动态扩容:最大装载因子默认是0.75,当HashMap中元素个数超过0.75*capacity(capacity表示散列表的容量)的时候,就会启动扩容,每次扩容都会扩容为原来的两倍大小。

  3. Hash冲突解决办法:JDK1.7底层采用链表法。

    在JDK1.8版本中,为了对HashMap做进一步优化,我们引入了红黑树。而当链表长度太长(默认超过8)时,链表就转换为红黑树。我们可以利用红黑树快速增删改查的特点,提高HashMap的性能。当红黑树结点个数少于8个的时候,又会将红黑树转化为链表。因为在数据量较小的情况下,红黑树要维护平衡,比起链表来,性能上的优势并不明显。

  4. Hash函数:JDK的hash函数非常经典,建议大家收藏,以后都可以用。

    int hash(Object key) {int h = key.hashCode()return (h ^ (h >>> 16)) & (capitity -1); //capicity表示散列表的大小,最好使用2的整数倍
    }
    

6 如何设计Hash

假如你在面试中碰到了要你如何设计一个高效的企业级Hash表。你该如何处理?

这里大家可以借鉴HashMap 的设计思路:

  1. 必须要高效:即插入,删除 查找必须要快
  2. 内存:不能占用太多的内存,考虑用其他的结构,比如B+Tree,HashMap 10亿,存硬盘的算法:mysql B+tree
  3. Hash函数:这个要根据实际情况考虑.%
  4. 扩容:就是预估数据的大小,HashMap 默认的空间是16? 我知道我要存10000个数,2^n > 10000 or 2^n-1
  5. Hash冲突后怎么解决:链表 数组。

7 Hash的应用

  1. 加密:MD5 哈希算法。还是存在密码冲突 128位的二进制串,可以表示2^128次,md5(md5(),”1231”),b不可逆,建了一个hash库,存起来了。 Md5(88888888),穷举

  2. 怎么判断视频是否是重复的?Md5();128位

  3. 相似性检测:论文检测,指纹算法。会把每个论文计算出一个指纹,汉明距离。

  4. 负载均衡:nginx,2台服务器;可以根据ip计算hash,再做一个取模2运算。

  5. 分布系统:数据分库问题。我不是讲过一个10亿的数据的搜索词,一台机器存不下。要分成10个文件。Hash(key)%10 = > 就可以知道某个key在哪一个文件?扩大成数据库的 分表(10张表) id%10 =()。

  6. 分布式存储的时候:问题来了 如果我加了一张表。原来是10张,现在是11张了 怎么办?要重新计算,分配的时候查询怎么办?数据量很大,迁移的不是太多了吗?

  7. 查找算法:hashMap 查找如何设计出自己的一个hash查找算法呢?快,hash冲突要少,数据大小。初始大小,扩容

  8. 一致性Hash:哈希环

    假设我们有k个表,数据的hash值范围:[0,Integer.max].我们把整个数据范围划分成n个区间(n个区间要远远大于我们的k),每一个表就是分配到n/k的区间。当有新的表要来了,我们只需要将某几个小的区间数据迁移就可以了。这是一个环形结构,其根本思想就是分段了。

重点部分:数组 链表 二叉树 红黑树 HashMap源码

8 HashMap源码(又双叒叕)

HashMap是Java集合框架中的一个重要类,用于存储键值对。

HashMap的一些核心常用方法的简要说明和示例代码,具体细节可能涉及到哈希碰撞、加载因子、扩容等实现细节,这些通常不需要开发者手动实现,但了解这些细节有助于更好地理解HashMap的工作原理。

  1. 构造方法:

    HashMap<Integer, String> map = new HashMap<>(); // 创建一个空的HashMap
    HashMap<Integer, String> mapWithCapacity = new HashMap<>(16); // 创建一个预设容量的HashMap
    
  2. put方法:

    map.put(1, "Apple"); // 添加键值对
    
  3. get方法:

    String value = map.get(1); // 获取键对应的值
    
  4. equals方法:

    在Java中,HashMapequals方法用于比较两个HashMap对象是否相等。equals方法首先会检查两个对象的hashCode是否相等,如果hashCode不等,那么两个对象不可能相等,如果hashCode相等,那么HashMap会进一步比较其中的元素。

    以下是HashMapequals方法的核心代码:

    public boolean equals(Object o) {if (o == this)return true;if (!(o instanceof Map))return false;Map<?,?> m = (Map<?,?>) o;if (m.size() != size())return false;try {Iterator<Entry<K,V>> i = entrySet().iterator();while (i.hasNext()) {Entry<K,V> e = i.next();K key = e.getKey();V value = e.getValue();if (value == null) {if (!(m.get(key)==null && m.containsKey(key)))return false;} else {if (!value.equals(m.get(key)))return false;}}} catch (ClassCastException unused) {return false;} catch (NullPointerException unused) {return false;}return true;
    }
    

    这段代码首先检查o是否等于this,如果是,则直接返回true。然后检查o是否是一个Map实例。如果不是,则直接返回false。如果是,HashMap会比较其大小,如果两个Map的大小不等,则直接返回false。接下来,HashMap会迭代其所有的Entry,并逐一检查o中是否包含相同的键值对。如果有任何一个键值对不匹配,则返回false。如果所有的键值对都匹配,则返回true

    这个方法是HashMap对象相等性的核心实现,它确保了两个具有相同键值对的HashMap被认为是相等的。

  5. remove方法:

    String removedValue = map.remove(1); // 移除键值对并返回值
    
  6. size方法:

    int size = map.size(); // 获取HashMap的大小
    
  7. isEmpty方法:

    boolean isEmpty = map.isEmpty(); // 检查HashMap是否为空
    
  8. containsKey方法:

    boolean contains = map.containsKey(1); // 判断HashMap是否包含键1
    
  9. containsValue方法:

    boolean containsValue = map.containsValue("Apple"); // 检查HashMap中是否包含指定值
    
  10. keySet方法:

    Set<Integer> keySet = map.keySet(); // 获取HashMap中所有键的Set视图
    
  11. values方法:

    Collection<String> values = map.values(); // 获取HashMap中所有值的Collection视图
    
  12. entrySet方法:

    Set<Map.Entry<Integer, String>> entrySet = map.entrySet(); // 获取HashMap中所有键值对的Set视图
    
  13. clear方法:

    map.clear(); // 清空HashMap中的所有键值对
    
  14. hashCode方法:

    Collection<String> values = map.values(); // 获取HashMap中所有值的Collection视图
    
  15. clone方法:

  16. hash方法(用于自定义对象作为键时):

    public class MyKey {int value;// 必须重写hashCode方法@Overridepublic int hashCode() {return Objects.hash(value);}// 必须重写equals方法@Overridepublic boolean equals(Object obj) {if (this == obj) return true;if (obj == null || getClass() != obj.getClass()) return false;MyKey myKey = (MyKey) obj;return value == myKey.value;}
    }
    

    注意:以上代码示例假设IntegerString是键和值的类型,实际使用时可以替换为任何实现了equals()hashCode()方法的对象。

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

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

相关文章

C++初学者指南-2.输入和输出---命令行参数

C初学者指南-2.输入和输出—命令行参数 文章目录 C初学者指南-2.输入和输出---命令行参数1.这是什么&为什么这样&#xff1f;2.如何在C中访问3.转换为std::string、int......4.字符串到数字的转换函数5.命令行参数解析库 1.这是什么&为什么这样&#xff1f; 程序调用后…

说说 SSL 的错误认识和不足之处

最近明月在学习折腾 LNMP 期间无意中建了一个 Typecho 的博客小站&#xff0c;近一周的折腾下来&#xff0c;收获真的不少&#xff0c;致使兴趣也越来越浓了&#xff0c;在升级 LNMP 的时候捎带手的给这个 Typecho 博客也启用了 SSL。并且开启了 memcached 和 OPcache 优化加速…

C++在VS2022开发Windows窗口程序1:第一个win窗口程序

Windows操作系统是由微软公司开发和维护的一系列图形化操作系统的统称。Windows操作系统主要用于个人计算机、笔记本电脑、平板电脑、服务器等设备上。Windows起源于Microsoft-DOS模拟环境&#xff0c;相比于DOS的指令化模式&#xff0c;Windows采用图形化的模式&#xff0c;因…

OkHttp框架源码深度剖析【Android热门框架分析第一弹】

OkHttp介绍 OkHttp是当下Android使用最频繁的网络请求框架&#xff0c;由Square公司开源。Google在Android4.4以后开始将源码中的HttpURLConnection底层实现替换为OKHttp&#xff0c;同时现在流行的Retrofit框架底层同样是使用OKHttp的。 源码传送门 优点: 支持Http1、Http…

[保姆级教程]uniapp设置字体引入字体格式

文章目录 在 UniApp 中设置和引入自定义字体&#xff08;如 .ttf、.woff、.woff2 等格式&#xff09;通常涉及几个步骤。 准备字体文件&#xff1a; 首先&#xff0c;你需要有字体文件。这些文件通常以 .ttf、.woff 或 .woff2 格式提供。确保有权使用这些字体&#xff0c;并遵守…

如何在Web开发中创建、删除和修改按钮:实用指南

在Web开发中&#xff0c;创建、删除和修改按钮是常见的用户交互元素&#xff0c;用于管理数据、改变状态或执行特定操作。本篇博客将介绍如何设计和实现这些按钮&#xff0c;以及一些实用的技巧和最佳实践。 创建按钮 创建按钮通常用于添加新数据或执行新操作。在HTML中&…

代码随想录算法训练营第二十八天

题目&#xff1a;134. 加油站 暴力方法 暴力的方法很明显就是O(n^2)的&#xff0c;遍历每一个加油站为起点的情况&#xff0c;模拟一圈。 如果跑了一圈&#xff0c;中途没有断油&#xff0c;而且最后油量大于等于0&#xff0c;说明这个起点是ok的。 暴力的方法思路比较简单…

SCI一区TOP|电鳗觅食优化算法(EEFO)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;W Zhao受到自然界中电鳗群体觅食行为启发&#xff0c;提出了电鳗觅食优化算法&#xff08;Electric Eel Foraging Optimization, EEFO&#xff09;。 2.算法原理 2.1算…

通俗易懂四元数

基本概念 定义&#xff1a; 四元数是由实部和虚部组成的扩展复数。一个四元数可以表示为 q a b i c j d k q a bi cj dk qabicjdk&#xff0c;其中 w w w 是实部&#xff0c; ( x i , y j , z k ) (xi, yj, zk) (xi,yj,zk) 是虚部。他的共轭值定义为&#xff1a; …

泛微E9技术网站

泛微E9技术网站: 1、丸子小工具 - 丸子张丨OnesZha 2、官方文档网站首页&#xff1a; 泛微在线文档 (e-cloudstore.com) 2.1、E9表单建模前端接口API 泛微在线文档 (e-cloudstore.com) 2.2、E9流程表单前端接口API 泛微在线文档 (e-cloudstore.com)

SSRF漏洞原理与案例分析

一、什么是SSRF漏洞 SSRF (Server-Side Request Forgery&#xff1a;服务器端请求伪造)是一种由攻击者构造请求&#xff0c;由服务端发起请求的安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的&#xff0c;所以服务端能请…

Marin说PCB之如何在CST仿真软件中添加三端子的电容模型?--02

小编我在上期文章的结尾给大家留下一个小问题就是&#xff1a;在三端子电容创建模型中间的部分我有说了一句就是&#xff1a;&#xff08;其中有一个creat reference pin 设置我们也默认不勾选&#xff09;&#xff0c;这个勾选不勾选有啥区别呢&#xff1f;这期文章就来给大家…

提高LabVIEW程序可靠性

​提高LabVIEW程序的可靠性是确保系统稳定运行、减少故障和维护成本的重要措施。以下从多个方面详细分析如何提高LabVIEW程序的可靠性 1. 选择合适的架构 1.1 状态机架构 适用情况&#xff1a; 多状态、多步骤操作。 具体例子&#xff1a;在一个自动测试系统中&#xff0c;…

【Samba端口映射文件共享】

Samba端口映射文件共享 参考链接&#xff1a;windows和linux之间的共享目录,实现Windows和Linux之间的文件共享 首先需要安装samba&#xff0c;Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件&#xff0c;由服务器及客户端程序构成。SMB(Server Messages Block&#xff…

微信小程序canvas2d频繁重绘时图片闪烁问题

问题&#xff1a;使用了拖动事件&#xff0c;需要频繁重绘canvas&#xff0c;导致图片闪烁。 原因&#xff1a;官方示例中&#xff0c;canvas2d需要手动加载图片&#xff0c;再在图片的onLoad函数绘制图片&#xff0c;延迟太高&#xff0c;导致刷新时图片闪烁。 解决&#xff1…

[汇总] Docker容器详解 Macvlan 创建不同容器独立跑仿真(持续更新中)

一、概念介绍 1.1 什么是macvlan macvlan是一种网卡虚拟化技术&#xff0c;能够将一张网卡&#xff08;Network Interface Card, NIC&#xff09;虚拟出多张网卡&#xff0c;这意味着每个虚拟网卡都能拥有独立的MAC地址和IP地址&#xff0c;从而在系统层面表现为完全独立的网络…

mybatisplus字段注入MetaObjectHandler扫描不到我的指定填充字段

使用mybatisplus自带的字段填充策略注入值的时候&#xff0c;发现并没有扫描到我的指定字段。 1. 初始代码 Component Slf4j public class MyMetaObjectHandler implements MetaObjectHandler {private static final String createByFiled "createBy";private stati…

Python数据可视化---pygal模块(基础篇)

pygal模块 安装pygal模块 pygal模块的安装非常简单&#xff0c;只需输入一行pip命令即可 pip install pygal安装完成&#xff1a; pygal模块介绍 pygal官网地址 pygal是Python的第三方库&#xff0c;他的主要功能就是数据可视化&#xff0c;即将数字转化成图表的形式来呈…

情绪管理篇:让七情自然流露,不过分压抑也不掺杂极端的想法即可来去自如

情绪管理篇&#xff1a; 人有七情&#xff0c;本属常理&#xff0c;该哭的时候哭、该笑的时候笑、该怒的时候怒、该忧的时候忧 学习圣贤之学&#xff0c;并非让我们像木头人一样&#xff0c;枯木死灰&#xff0c;而要让自己不要被七情所缠缚、被七情所乱心&#xff0c;我们的喜…

CUDA-Programming-Guide-in-Chinese

CUDA-Programming-Guide-in-Chinese/第1章CUDA简介 at main HeKun-NVIDIA/CUDA-Programming-Guide-in-Chinese GitHub