正在写一篇博客,但是由于还没有去看过 hashset 或 hashmap 的源码,只是自己想当然的这么理解哈希容器放置元素的过程,怕自己误人子弟啊😂
1
renmu 2019-12-01 16:07:38 +08:00 via Android
就是很标准的哈希表的实现,可以去看一下哈希表的 wiki
|
2
cxtrinityy 2019-12-01 16:15:48 +08:00 via Android 3
对倒是没啥不对,就是还要稍微深入点,第一点,数组下标是由 hashcode 和 size 通过除留余数法得出的,第二点,jdk 的实现一般在桶位上使用链表,链表内超过 8 个会转换为红黑树,以此加速相同 hash code 的查找比较,第三点,每个 key 得到不同 hashcode 这种完美散列实际情况常常难以满足,因为 jdk 的实现,数组 size 不是素数,而是 2 的幂次,方便用位操作加速下标的计算,开发编写的 hash 方法也是其中影响的一环,同时注意 load factor
|
3
amiwrong123 OP @renmu
看到这句话 A real world example of a hash table that uses a self-balancing binary search tree for buckets is the HashMap class in Java version 8. self-balancing binary search tree 这难道就是传说中的红黑树😂 |
4
amiwrong123 OP @cxtrinityy
好吧,确实是不够深入。你说的这几点我记下,回头再继续看。你说的第三点感觉挺有意思,虽然我现在有点理解不了,哎,得看源码了。 |
5
qwerthhusn 2019-12-01 19:29:40 +08:00
你没有提到一个哈希桶里面具体是什么,
其实是一个双向链表,如果链表里面的值过多(好像是 6 还是 8 忘记了),会转化成红黑树。 |
6
lhx2008 2019-12-01 19:33:45 +08:00 via Android
差不多
@cxtrinityy 其实并不是 hashcode 直接算的,还要高低一半的位做一些运算,确保 hashcode 足够混乱 |