V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
oahebky
V2EX  ›  Java

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

  •  
  •   oahebky · 2020-08-14 15:44:06 +08:00 · 2215 次点击
    这是一个创建于 1322 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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


    当然,通用的 hashmap 更复杂。

    不过主要道理是这个理。

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

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

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


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

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

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

    虽然不能提高“硬”编程水平;不过对“软”编程知识还是有帮助的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3685 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 10:42 · PVG 18:42 · LAX 03:42 · JFK 06:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.