面试专栏
文章平均质量分 63
以小傅哥的面经作为基础,进行知识点的梳理
aiit_zws
这个作者很懒,什么都没留下…
展开
-
HashMap源码分析(下)
本节将分析HashMap的增删改查;首先来说HashMap的插入流程:1.计算下标 2.何时扩容 3.何时链表转红黑树,具体如下:(1) 首先进行哈希值的扰动,获取新的hash值,(key==null) ? 0:(h=key.hashcode())^(h>>>16);(2) 判断tab是否为空或者长度为0,如果是则进行扩容操作。if((tab=table) == null || (n=tab.length)==0) n=(tab=resize()).length;(原创 2021-02-09 16:55:56 · 127 阅读 · 0 评论 -
HashMap源码解析(上)
在面试中,HashMap的重要性,咱们不用多说了,那是相当重要的,咱们深入分析这个HashMap。首先咱们先从以下几个方面来看HashMap:1.散列表实现 2.扰动函数 3.初始化容量 4.负载因子 5.扩容元素拆分先来看看最简单的HashMap的散列表实现:主要思想就是,使用生成的hashcode与数组长度做与运算,使得每个元素在这个数组中都有相应的位置。以下是小傅哥画的这个过程的示意图:上述实现存在的问题:可能因为Hash碰撞导致链表长度比较长,这样就不能发挥hash的原创 2021-02-09 14:37:53 · 109 阅读 · 0 评论 -
HashCode为什么要用31作为乘数?
在HashMap中hashcode生成的代码中,竟然有一个31的固定值,这是为什么呢,这个咱们可以来看国外大神在stackoverflow上的回答。其中点赞数最高的是下面这个回答:这个在理论的高度上做出了解释,好像还是不是很有实战意义,来看第二个呼声最高的回答这个回答就相当具有实战意义了,只要我们本地准备单词表,就能对31,33,37,39和41这些样本进行逐个测试。测试结果如图,乘数31,hash碰撞概率到达临界点突然下降很多。但是下面蓝色框内碰撞概率更小,..原创 2021-02-09 10:28:32 · 1378 阅读 · 0 评论