Java面试——HashMap

HashMap
散列法(Hashing): 将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,称为散列法,也叫哈希法

由于通过更短的哈希值比用原始值进行数据库搜索更快,这种方法一般用来在数据库中建立索引并进行搜索,同时还用在各种解密算法中。

1.HashMap 概念 和 底层结构
HashMap是基于 哈希表 的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null 值 和 null 键。HashMap 存储的是键值对,HashMap很快,但是不保证映射的顺序,特别是它不保证改顺序不变;

HashMap 实际上是一个“链表散列”的数据结构,即 数组 和 链表 的结合体。

数组: 存储区间连续,占用内存严重,寻址容易,插入删除困难;
链表:存储区间离散,占用内存比较宽松,寻址困难,插入删除容易;
HashMap综合应用了这两种数据结构,寻址容易,插入删除容易;

image.gif

1.1 HashMap的基本存储原理以及存储内容的组成
基本原理:

声明一个下标范围比较大的数组来存储元素;
设计一个哈希函数来获取每一个元素的Key(关键字)的函数值(数组下标, hash值)相对应
数组存储的元素的一个Entry类,这个类有三个数据域,key、value、next(指向下一个Entry)
1.2 HashMap 的工作原理以及储存方法过程
HashMap的工作原理 :HashMap是基于散列法(又称哈希法hashing)的原理,使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。

   当我们给put()方法传递键和值时,我们先对 键(Key)调用hashCode() 方法,返回hashCode用于找到bucket(桶)位置来存储Entry对象

在这里插入图片描述

判断键值对数组table[i]是否为null,为null则执行resize() 扩容;
根据Key获取hash值得到插入的数组索引i,如果table[i] = null,直接新建节点添加,转向第6,否则转向第3;
判断table[i] 的首个元素是否和Key(Entry 里存放 “value + Key” ,但是Entry的索引 i 是key的hash值)一样,如果相同直接覆盖value;否则继续 第4步(注:这里的相同指的是hashCode 以及equals)
判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值对 , 否则继续走第5部
遍历table[i],判断链表长度是否>8,大于8的话把链表转换为红黑树,在红黑树中执行插入操作,否则进行链表的插入操作;遍历中发现key以及存在直接覆盖value
插入成功后,判断实际存在的键值对数量size是否超过了最大容量,超过了则扩容;
1.3 HashMap 数据结构
https://www.cnblogs.com/skywang12345/p/3310835.html

image.png

HashMap是通过“拉链法”实现的哈希表。它包括几个重要成员变量

table: 是一个Entry[]数组类型,而Entry实际上就是一个单向链表。哈希表的“key-value键值对”都是存储在Entry数组中。
size:HashMap的大小,它是HashMap保存的键值对的数量。
threhold:HashMap 的阈值,用于判断是否需要调整HashMap的容量。threshold的值= “容量*加载因子”,当HashMap中存储数据的数量达到threshold时,HashMap的容量就加倍;
loadFactor:加载因子
modCount: 用来实现fail-fast机制

1.4 Hash冲突
哈希表的特点:关键字和它在表中存储位置之间存在一种函数关系。这个函数我们称为为哈希函数(简单的说就是一种将任意长度的消息压缩到固定长度的消息的函数。)

hash冲突:就是 键(key)经过hash函数得到的结果作为地址去存放当前的键值对(key-value)(这个是hashmap的存值方式),但是却发现该地址已经有人先来了,一山不容二虎,就会产生冲突。这个冲突就是hash冲突了。

一句话说就是:如果两个不同对象的hashCode相同,这种现象称为hash冲突。

  1. 红黑树
    http://www.360doc.com/content/18/0904/19/25944647_783893127.shtml

红黑树是一种自平衡的二叉查找树,是一种高效的查找树。

2.1 二叉查找树
image.gif

image.gif

2.2 红黑树
红黑树是一种自平衡的二叉查找树,是一种高效的查找树。

关于红黑树的演变

https://blog.csdn.net/chen_zhang_yu/article/details/52415077

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值