| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> HashMap浅薄详解见解 -> 正文阅读 |
|
[数据结构与算法]HashMap浅薄详解见解 |
HashMap自我见解1、概述想要API的链接:最新版API JDK11版本中文释义 我们可以看到API中说明了,HashMap是基于哈希表的Map接口的实现。那其实java中对于HashMap的实现是采用对象数组+链表,而且在链表达到一定长度时,链表会转变成二叉树存储。 解释一下,这其中所谓的支持此方法,是你所编写的类重写了hasCode()方法,而散列表就是哈希表。 2、数据结构:哈希表那我们来讲一讲哈希表: 首先,上面已经说过,我们也了解一下Object.hashCode()这个方法了。那么我们因为要举例的嘛,所以我创建一个Object对象,别问我为什么创建Object,这还不是因为java万物皆对象。那之后我们搞一个哈希表,我们默认长度为16。那图中也有描述,在存储到哈希表时,会调用我们的hashCode值,然后与哈希表数组长度进行取模运算。那我们想一下,我们不管是多大的数据,取模16,得到的数字一定是0 - 15,对吧。那我们得到的这些0 - 15的数据就是下标。而下标可以确定对象存在哪个位置。 我们图中也举了个例子:一个数据的hash值为17,那我们的这个对象会存储到1下标。那么首先呢,我们要进行对这个1下标的存储数据进行判断,判断是否有数据,只有这个1下标指向的位置为null时,那我们可以直接存储进去。那如果有数据怎么办?哎,我就想存到这个1下标,有数据我也要存。这就好比一个茅坑一只屁股,那你非要和别人一起,那怎么办?放心,有办法,这就体现出我们的M哈希表的好处来了。 我们之前说过哈希表这个数据结构是什么样的?是对象数组+链表的,也就是说,当我们这个下标指向的位置有数据了,那又来了一个下标为1的数据,我们就将其排在这个数据之后,依次排开。 那又有一个情况:那在JDK1.8之后呢,当我们的哈希桶(能放一个链表的这个小框)中的数据数据大于8时,我们的链表会转换为红黑二叉树。(那如果有想要看的,可以去网上找,当然如果想要,可以直接留言,我会关注,指不定就更一个)。好,闲言少叙,废话不说啊,继续正文。 面试题这里可以说个小面试题:就是如图中所言,当HR提问:哎,小火鸡,我问你一个问题啊,如果是有一个哈希桶中的已知数据为7,注意听,那我要往6减,问一定会从红黑树转成链表吗? 别已学过这,就兴致勃勃的回答,哎,是的呢!是个屁啊,首先从逻辑都知道,那人家会问你一个傻瓜问题吗?会,但是也要当成不会,认真回答,仔细思考,沉思半刻,让HR觉得,哎这个小虎吉不错奥。你看他对待问题的态度多认真啊!真好啊,就录取他了。那这时其实你已经成功了一半,另一半就是你要准确全面的回答这个问题,按照您刚刚的描述,我觉得您问的不够准确,您只说了已知数据为7,但是您并没有确定现在的存储方式是链表还是红黑二叉树,那如果是链表的话,就说明次数据就已没有到8,所以不用转换,而如果是红黑二叉树的话,那就在减到6的时候转换成链表结构。其实说到这里,HR就已经在心里对你暗暗点头,要录用你了,如果大家真的遇到这个问题一定要这样回答,录用了也给我报一个喜讯啊! ----------------------------------------------------华丽的分割线----------------------------------------------------------------- 哈希表的实现好了说到这里,我们就结合API和源码来去看一下java中HashMap对于哈希表的实现。 我们首先来看一下他的这个构造方法:
为了方便大家的理解,我贴心的准备了一张图来系统完整的表达这个步骤。(还不快来点个赞啊!) 那其实说了这么多都是在分析put方法,那剩下的其他像get方法、remove方法、大家都可以根据以上流程去看看它的原理是什么?虽然说懂不懂这些原理都和咱们敲代码去使用这些方法没什么太大的影响,但是,积累知识不是使用处理方法,工具,而是让我们了解见识到这些内容下的原理才是,我们要学会透过事物看本质,敲代码大家多多少少都能敲,但是 明白内里才是一法通,万事成。 注意: 注意:
2、散列因子:如果我们设置个0.9,那可能存在大量哈希值碰撞的情况,就是某个桶中存了好几个数据都没有扩容。
好,最后我们进行一点小小的测试:
OK,获取+遍历打印 总结那通过这次的学习也算是对HashMap有了一丁丁的了解,革命尚未成功,同志们仍需努力,大不了转行呗,咱到哪都是最棒的!,对了,别忘了三连啊。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 17:45:24- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |