有什么资料(博客,书籍等)或在 v 站评论能了解清楚 Java (顺带 c++)的 HashMap 实现和熟练使用吗?

2020-08-14 15:44:06 +08:00
 oahebky

最好是有对比 Python 的 dict,有什么异同。

还是说 java 的 HashMap 和 Python 的 dict 在用法上除了 api 不同外,本质上完全一样?

2232 次点击
所在节点    Java
10 条回复
ethanSong
2020-08-14 17:09:25 +08:00
近期也看了不少关于 HashMap 的文章,发现都是讲 HashMap 源码实现流程的,后面学习了下数据结构的哈希查找,了解到什么是哈希函数,再回想到 HashMap 的本质其实是为了更好的查找,查找效率比着顺序查找,折半查找在使用场景和效率上都有很大的优势。你可以看看散列表和哈希查找,然后就可以比较深入的了解到 HashMap 的为什么这么设计了。个人见解。
chihiro2014
2020-08-14 20:14:58 +08:00
https://www.bilibili.com/video/BV1Qt4y117XJ
可以看这个,和 Java 的 hashmap 结合讲解
BoarBoar
2020-08-14 20:15:50 +08:00
老铁你这基础不太好啊,哈希表是数据结构,和语言无关。不管什么语言只是实现并把常用操作做了封装而已,最多就是一些细节有差别,比如解决哈希冲突的方法。
至于怎么实现的,直接去看源码不就是最好的,何必要看博客二手货。书籍我只知道严蔚敏的算法与数据结构。。大学学的,哈希表在工作中又很常用,想忘都难
aguesuka
2020-08-15 11:46:34 +08:00
什么都比不上自己做一个。自己去做的时候就会发现,很多没人提到的细节。比如 jdk8 的最坏时情况不是退化成红黑树,而是红黑树再退化成链表
aguesuka
2020-08-15 11:48:00 +08:00
主贴问题的答案应该是处理 hash 碰撞的方法不一样
oahebky
2020-08-15 13:30:26 +08:00
@aguesuka

恩,原意一部分就是想看看有没有实际实现的相关资料。

那些讲原理的已经看过了,现在想要问的是有什么材料可以学一下,以达到可以几分钟、十几分钟造个 hashmap 轮子。
chen006
2020-08-15 13:41:23 +08:00
算法十分熟悉,代码水平过关也挺难十几分钟就造一个轮子出来的,有点耐心好不好
oahebky
2020-08-15 14:16:44 +08:00
@chen006
不是指造一个标准库水平的通用轮子。

而是指根据实际问题,结合数据结构特性(如 hashset )造轮子(不借助标准库)来用。

比如 leetcode 的 design hashset 一题,限定了输入是 int 型取值 [ 1,1000000 ]。

比如遇到大量整型输入,但是取值限于 [ 300,400 ]之间,可以通过简单的取模实现。
> 像检查一个字符串( a-z )中的字符是否全部在另一个字符串( a-z )中存在的问题,可以建一个 26 长度的桶,简单取模就能实现 hashset,不用借助标准库。


当然,通用的 hashmap 更复杂。

不过主要道理是这个理。

所以才有这个帖子问问有没有人看到过这方面比较好的学习资料。

比如有没有博客可能介绍了不同的 hash 算法,将在大神论文中的 hash 算法通过博客或书籍或视频揉碎了讲,甚至可能结合实际场景应用不同的 hash 算法造个 hashset/hashmap 的轮子。

当然,就实际通用的实现,用链表、二叉树、等等实现的,经过重复雕琢过的代码更精炼,学起来比自己实现一遍效率应该更高;但是这个数据结构直接看源码有点作死,所以想问问有没有博客或书籍或视频啥的把源码揉碎了讲的。


大致上就是如此,总的来说就是想问问有没有好学好理解的材料;

只看原理当然不可能很快写个轮子,

但是结合重复雕琢过的代码学过了,效果会很不一样。
xiaolinjia
2020-09-22 10:57:27 +08:00
https://mp.weixin.qq.com/s/WoGBUmISco60LQOoivB1QA
前几天看到一篇这样的文章。
oahebky
2020-09-22 12:40:42 +08:00
@xiaolinjia

虽然不能提高“硬”编程水平;不过对“软”编程知识还是有帮助的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/698284

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX