了解HashMap的底层原理

Map集合的特点和概述

Map集合概述

interface Map<K,V> K:键的类型;V:值的类型

Map集合的特点

键值对映射关系;

一个键对应一个值;

键不能重复,值可以重复;

元素存取无序;

HashMap 的实现原理?

HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作, 并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

HashMap的数据结构: 在Java编程语言中, 基本的结构就是两种,一个是数组,另外一个是模拟指针 (引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上 是一个“链表散列”的数据结构,即数组和链表的结合体。

HashMap 基于 Hash 算法实现的 1. 当我们往Hashmap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中 的下标 2. 存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相 同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value 放入链表中 3. 获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。 4. 理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方 式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。 需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个 之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)

HashMap

HashMap实现了Map接口,用于存储K,V键值对的集合类。

主要特征包括:Key可存NULL、无序、线程不安全。

存储结构: 底层使用了数组+链表+红黑树的结构。

查询:使用哈希算法查询

HashMap put 插入过程。

简单划分为以下4个过程:

1.初始化检查

如果数组为空,则初始化数据。

2.确定插入位置

散列计算确定插入的哈希桶位置,采用Hash值对N取模【 hash & (N-1)】,确定哈希桶的位置。

3.哈希碰撞、处理阶段

如果要插入的哈希桶为空,则直接插入节点。

如果哈希桶有值了,则判断是哈希冲突还是重复插入。

如果是重复插入,则更新插入的值。

如果是哈希冲突,则采取处理哈希冲突的策略,策略包括拉链法和构建红黑树。

4.容量检查、扩容

插入节点后,如果超出了阈值【数组大小*负载因子】,进行Resize扩容操作。

HashMap插入数组的位置如何确定。

采用Hash值对容量N取模,模得到的值即是下标值。
在HashMap中采用位运算进行取模:(n-1) & hashCode()。

HashMap如何判断哈希冲突

当两个Key的HashCode相同,且Key不同时,认定为冲突。

HashMap中如何处理哈希碰撞。

当发生哈希碰撞时,首先会采用拉链法处理冲突。

当哈希桶中拉链长度小于等于8时,会采用尾插法插入节点,形成一个单向链表。

当拉链长度大于8,且数组容量【哈希桶】小于64时,会进行扩容,不会进行树化。

当拉链大于8且数组容量大于等于64时,会将链表转换为红黑树。

HashMap在JDK1.7和JDK1.8中有哪些不同? HashMap的底层实现

在Java中,保存数据有两种比较简单的数据结构:数组和链表。数组的特点是:寻址容易,插入和删除 困难;链表的特点是:寻址困难,但插入和删除容易;所以我们将数组和链表结合在一起,发挥两者各 自的优势,使用一种叫做拉链法的方式可以解决哈希冲突。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值