
面试真经
文章平均质量分 88
本专科实时收集市场高频面试题和作者以往的面试经验。
码农~明哥
七年 IT工程师一名 现目前在基金投研公司担任java 大数据开发工程师 天天不是在写软件就是在写bug的路上。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
HashMap 源码分析(下)
HashMap 这种散列表的数据结构,最大的性能在于可以 O(1)时间复杂度定位到元素,但因为哈希碰撞不得已在一个下标里存放多组数据,那么 jdk1.8 之前的设计只是采用链表的方式进行存放,如果需要从链表中定位到数据时间复杂度就是O(n),链表越长性能越差。HashMap 是基于数组+链表和红黑树实现的,但用于存放 key 值得的数组桶的长度是固定的,由初始化决定。我们讲解并用数据验证了,HashMap 中的,散列表的实现、扰动函数、负载因子以及扩容拆分等核心知识点以及相应的作用。原创 2025-01-15 14:11:21 · 708 阅读 · 0 评论 -
HashMap 源码分析(上)
到一个下标值,也就是我们上面做的散列列子。乍一看可能有点晕😵怎么都在向右移位 1、2、4、8、16,这主要是为了把二进制的各个位置都填上 1,当二进制的各个位置都是 1 以后,就是一个标准的 2 的倍数减 1 了,最后把结果加 1 再返回即可。初始化大小里,都可以知道,散列数组需要一个 2 的倍数的长度,因为只有 2 的倍数在减 1 的时候,才会出现 01111 这样的值。5. 这里所有的元素存放都需要获取一个索引位置,而如果元素的位置不够散列碰撞严重,那么就失去了散列表存放的意义,没有达到预期的性能。原创 2025-01-15 13:49:43 · 943 阅读 · 0 评论 -
HashCode 为什么使用 31 作为乘数?
s[0]*31^(n-1) + s[1]*31^(n-2) + …这个过程比较简单,与原 hash 函数对比只是替换了可变参数,用于我们 统计不同乘积数的计算结果。2, 3, 5, 7, 17,31, 32, 33, 39, 41, 199,最终返回一个 list 结果并输出。这个问题其实指的就是,hashCode 的计算逻辑中,为什么是 31 作为乘数。以上就是不同的乘数下的 hash 碰撞结果图标展示,从这里可以看出如下信息;想计算碰撞很简单,也就是计算那些出现相同哈希值的数量,计算出碰撞总量即。原创 2025-01-15 10:11:41 · 335 阅读 · 0 评论