平凡之路

继往圣绝学,当涌泉相报。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

神奇的散列表

用键-值的方式来存储数据的就是散列表。散列表本质上就是一个数组,只是将k值通过哈希函数转换成了二进制数,不同的语言中哈希函数实现不一样,以Java为例子,在Java及大多数面向对象的语言中,每一个对象都有属于自己的hashcode,这
个hashcode是区分不同对象的重要标识。无论对象自身的类型是什么,它们的hashcode都是一个整型变量。,既然都是整型变量,想要转化成数组的下标也就不难实现了。最简单的转化方式是什么呢?是按照数组长度进行取模运算。
index = HashCode (Key) % Array.length
得到下标。

HashMap是什么?

HashMap是一种存储结构,其底层数据结构为数组加链表,数组是HashMap的主体,链表则是为了解决哈希冲突。从JDK1.8开始,当数组的长度大于64,会对数组进行扩容,且链表的长度大于8的时候,会把链表转为红黑树。

HashMap的一些特性.

哈希算法:

  1. 定义:
    将任意长度的二进制值串(虚拟内存地址)映射为固定长度的二进制值串(哈希值,又称为哈希码,此处哈希值并不等于哈希表中下标),
    这个映射的规则就是哈希算法,
    而通过原始数据映射之后得到的值就是哈希值(也称为:哈希码)。

  2. 使用哈希算法优点:
    提高存储空间的利用率,
    可以提高数据的查询效率,
    也可以做数字签名来保障数据传递的安全性。
    还具有一个特点,就是很难找到逆向规律。

  3. 拓展
    上面讲的映射规则,这种转换是一种压缩映射,
    也就是,输出的哈希值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从哈希值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
    总结:通过哈希算法,我们可以将k转换成哈希值,再通过算法将哈希值转换成数组的下标.
    Hash、Hash算法、Hash函数、Hash值、Hash码、Hash表,它们的意思
    [Java面试必问]HashMap中是如何计算数组下标的?

哈希冲突

哈希冲突是指哈希函数算出来的地址被别的元素占用了。

如何解决哈希冲突

1)开放定址法或散列法:
基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。其中H(key)为哈希函数,m 为表长,di称为增量序列。增量序列的取值方式不同,相应的再散列方式也不同。
(2)再哈希法:
这种方法是同时构造多个不同的哈希函数:当一个哈希函数地址还产生冲突时,在计算另一个哈希函数地址,直到不再发生冲突为止。
(3)链地址法(拉链法)
这种方法的是将所有哈希地址相同的元素i构成一个单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在单链表中进行。链地址法适用于经常进行插入和删除的情况。
具体过程:添加一个元素的时候,首先计算元素key的hash值,确定插入数组中的位置。如果当前位置下没有重复数据,则直接添加到当前位置。当遇到冲突的时候,添加到同一个hash值的元素后面,行成一个链表。这个链表的特点是同一个链表上的Hash值相同。java的数据结构HashMap使用的就是这种方法来处理冲突,JDK1.8中,针对链表上的数据超过8条的时候,使用了红黑树进行优化。
(4)建立公共溢出区
这种方法就是将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。
哈希冲突?

HashMap是如何解决哈希冲突的?

HashMap在JDK1.8版本中,通过链式寻址法+红黑树的方式来解决hash冲突问题,其中红黑树是为了优化Hash表链表过长导致时间复杂度增加的问题。当链表长度大于8并且hash表的容量大于64的时候,再向链表中添加元素就会触发转化
「面试普通人VS高手系列」HashMap是怎么解决哈希冲突的

HashMap中put方法和get方法实现原理

put:通过key获取hashcode,再通过转换方法获取下标号,查看否有值,没有,直接添加首节点,有的话遍历链表,在尾部插入数据。(拉链法+尾插法
get:通过key获取hashcode,再通过转换方法获取下标号,查看否有值,没有,返回false,有的话遍历链表,使用equals比较key的内容。(equals方法需要重写)
HashMap中put与get的实现原理
什么是拉链法?

posted on 2023-02-20 15:42  Hxx(加油版)  阅读(16)  评论(0编辑  收藏  举报