首页 > 其他分享 >你能谈谈HashMap怎样解决hash冲突吗

你能谈谈HashMap怎样解决hash冲突吗

时间:2023-03-16 20:58:03浏览次数:48  
标签:hash HashMap 查询 链表 谈谈 Hash hashCode

在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样。

HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置。当程序执行 map.put(String,Obect)方法 时,系统将调用String的 hashCode() 方法得到其 hashCode 值——每个 Java 对象都有 hashCode() 方法,都可通过该方法获得它的 hashCode 值。得到这个对象的 hashCode 值之后,系统会根据该 hashCode 值来决定该元素的存储位置。

散列表要解决的一个问题就是散列值的冲突问题,通常是两种方法:链表法和开放地址法

  • 链表法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位;
  • 开放地址法是通过一个探测算法,当某个槽位已经被占据的情况下继续查找下一个可以使用的槽位。

java.util.HashMap采用的链表法的方式,链表是单向链表。

当创建 HashMap 时,有一个默认的负载因子(load factor),其默认值为 0.75,这是时间和空间成本上一种折衷:增大负载因子可以减少 Hash 表(就是那个 Entry 数组)所占用的内存空间,但会增加查询数据的时间开销,而查询是最频繁的的操作(HashMap 的 get() 与 put() 方法都要用到查询);减小负载因子会提高数据查询的性能,但会增加 Hash 表所占用的内存空间。

当数组长度为2的n次幂的时候,不同的key算得得index相同的几率较小,那么数据在数组上分布就比较均匀,也就是说碰撞的几率小,相对的,查询的时候就不用遍历某个位置上的链表,这样查询效率也就较高了。

 

参考:

 

标签:hash,HashMap,查询,链表,谈谈,Hash,hashCode
From: https://www.cnblogs.com/xfeiyun/p/17224072.html

相关文章

  • python中的hashlib模块
    md5是一种常见不可逆加密算法,使用简单,计算速度快,在很多场景下都会用到,比如:给用户上传的文件命名,数据库中保存的用户密码,下载文件后检验文件是否正确等。官网:https://docs.......
  • 「解题报告」ARC132F Takahashi The Strongest
    不会FWT的真实。需要重写篇FWT博客。考虑Takahashi获胜当且仅当Aoki和Snuke选的相同,Takahashi选的是它的下一个。至少有一个相等,可以容斥为所有的都不相等。......
  • 谈谈 Redis 的过期策略
    在日常开发中,我们使用Redis存储key时通常会设置一个过期时间,但是Redis是怎么删除过期的key,而且Redis是单线程的,删除key会不会造成阻塞。要搞清楚这些,就要了解R......
  • 谈谈项目中单点登录的实现原理?
    单点登录在现在的系统架构中广泛存在,它将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同的单点登......
  • 第23课:Spark旧版本中性能调优之HashShuffle剖析及调优
    第23课:Spark旧版本中性能调优之HashShuffle剖析及调优2个core表示2个并行度文件个数:cpucores*reducestasksspark.shuffle.consolidateFiles=trueHashShuffle在spark中......
  • HashMap、Hashtable、ConcurrentHashMap线程安全问题
    publicclassHashMapDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{//HashMap是线程不安全的//Hashtable是线......
  • Java的HashMap
    基于hash值的K-V结构数据容器。重要计算方法计算key的hash值(key==null)?0:(h=key.hashCode())^(h>>>16)利用hash计算tab中的位置p=tab[i=(n-1)&......
  • 基于hash的改变实现SPA
    一、原理主要是通过window.onhashchange方法监听window.location.hash的改动这里我直接用a元素来改变hash通过设置dom节点的innerHTML,来实现页面切换hashRouter对象中......
  • Java容器之Hashtable源码分析
    一、概述Hashtable是一个比较古老的Map实现类,从它的名称就可以看得出来,因为没有遵循Java的语言规范。它和HashMap很像,同属于散列表,有以下特性:线程安全,这也估计算是唯一......
  • C - Make Takahashi Happy
    题目大意:左上角走到右下角,经过的路径权值连起来不能有重复,把没有重复的路径的条数加起来输出。我自己写的时候也磕磕绊绊,主要是自己模拟一边,理明白了就好了#include<ios......