浅谈HashMap的底层

一,什么是hash

核心理论: hash也称散列,哈希,基本原理就是把任意长度的输入,通过哈希算法变成固定长度的输出,这个映射的规则就是对应的hash算法,而原始数据映射后的二进制串就是哈希值!
hash特点:

1.从hash值不可以反向推导出原始的数据
2.输入数据的微小变化会得到完全不同的hash值,相同的数据会得到相同的值
3.哈希算法的执行效率要高效,长的文本也能快速的计算出哈希值
4.hash算法的冲突概率较小

二,Hash碰撞

当hash表里的数据已经存在,此时再向已存在的hash表存放值,就会产生hash碰撞。

三,HashMap结构

Hashmap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
JDK1.7之前,hashMap的的结构为数组+链表,我们首先来说说数组和链表的区别:

数组静态分配内存,链表动态分配内存;
数组在内存中连续,链表不连续;
数组元素在栈区,链表元素在堆区;
数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);
数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。

数组的查询速度较快,但是插入和删除很慢,我们知道数组是有序的,当数组删除一个元素或者增加一个元素后,数组的索引下标需要重新排列,因此增删慢!
而链表是无序的,它的查询慢,但是增删快,它的查询时间复杂度为O(n),这也是jdk1.7存在的问题
JDK1.8之后,引进了红黑树的概念,HashTable的结构变为:数组+链表+红黑树。
1.链表长度符合泊松分布,各个长度命中概率依次递减,当阈值为8时,概率为0.00000006,我们的 Map 里面是不会存储这么多的数据的,所以通常情况下,并不会发生从链表向红黑树的转换。
2.链表的结构是插入快,查询慢;红黑树的结构是插入慢,查询快。当链表长度达到8时,插入快的优势就变得不明显,链表长度小于8时,查询的速度也能接受,这也是为什么长度达到8会变成红黑树的原因。

为什么hashmap的长度是2的整数次幂: 为了加快hash计算以及减少hash冲突,如果不是2的整数次幂,则会出现空的hash桶!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值