有什么资料(博客,书籍等)或在 v 站评论能了解清楚 Java (顺带 c++)的 HashMap 实现和熟练使用吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
oahebky
V2EX    Java

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

  •  
  •   oahebky Aug 14, 2020 2747 views
    This topic created in 2093 days ago, the information mentioned may be changed or developed.

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

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

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

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

    那些讲原理的已经看过了,现在想要问的是有什么材料可以学一下,以达到可以几分钟、十几分钟造个 hashmap 轮子。
    chen006
        7
    chen006  
       Aug 15, 2020 via Android
    算法十分熟悉,代码水平过关也挺难十几分钟就造一个轮子出来的,有点耐心好不好
    oahebky
        8
    oahebky  
    OP
       Aug 15, 2020 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  
       Sep 22, 2020   1
    https://mp.weixin.qq.com/s/WoGBUmISco60LQOoivB1QA
    前几天看到一篇这样的文章。
    oahebky
        10
    oahebky  
    OP
       Sep 22, 2020 via Android
    @xiaolinjia

    虽然不能提高“硬”编程水平;不过对“软”编程知识还是有帮助的。
    About     Help     Advertise     Blog     API     FAQ     Solana     2345 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 43ms UTC 00:01 PVG 08:01 LAX 17:01 JFK 20:01
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86