哈希表(散列表)的一些理解

哈希表
1.定义:哈希表,英文为Hash Table,中文也可以叫做散列表,它是通过关键码值(key value)映射到表中一个位置来访问表中的元素内容,这样就可以加快查找的速度。这个映射函数叫做散列函数,存放元素内容(或者说是记录)的数组叫做散列表。


2.HashSet和HashMap的底层实现都是哈希表(散列表)!
HashSet是通过HashMap来实现的,HashSet是保存单值的,而HashMap是保存键值对的,HashMap的输入参数有Key、Value两个,在实现HashSet的时候,保持HashMap的value为常量,相当于在HashMap中只对key对象进行处理,因为HashSet只是保存单值的,这个单值就是Key对象。


3.HashMap的底层是一个数组结构,数组中的每一项对应了一个链表,这种结构称为"链表散列"的数据结构,即数组和链表的结合体,也叫散列表、哈希表。这种实现方法是哈希表最常见的实现方法,叫做拉链法,我们可以理解为"链表的数组",就是链表和数组的结合体。


4.为何哈希表是链表和数组的结合体呢?
数组:易于读取(通过for循环),不便存储(数组长度有限制),插入和删除难;
链表:易于存储(插入和删除容易),不易于快速读取。


5.哈希表原理
对HashMap的Key调用hashCode()方法,返回int值,即hashCode值,也可以说这是关键字Key通过哈希函数变成了一个整型数字,然后将这些散列地址对数组进行取余,把这些散列地址映射成该数组的下标,再把value存储在该下标对应的数组空间中。把任意长度的输入,通过散列算法(散列函数),变成固定长度的输出,该输出就是散列值,散列地址也就是这些映射成数组下标的值。如果该集合中存储的对象元素有成百上千个甚至成千上万个,那么就很有可能许多个元素的Key的散列地址映射成了数组中相同的下标值(毕竟数组长度有限,而且它是拉链法实现的,映射成数组中相同下标值的元素可以放在同一个链表当中去)。


6.HashMap存储对象过程
1)对HashMap的Key调用hashCode()方法,返回int类型的散列地址,此时散列地址会映射到数组的下标。
2)根据数组的下标,尝试把该Key代表的对象元素放在该下标对应数组的位置空间,如果该位置没有对象,则放进去;如果有对象,则查找到该索引位置的链表,利用equals()方法去判断是否与这些元素相同(返回true),如果存在相同的,则把该元素的值替换成新的,如果equals()方法返回false,则说明你所要添加进去的对象和所在链表中的对象没有出现重复的,于是,就把所要添加的对象链接到该链表的头部,以前存在对象的链表接到该对象的后面,于是就形成了Entry链。<Key的hashCode(key.hashCode)相同的话就存储在数组中同一下标的Entry链中>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值