阅读源码到底有没有没有意义
首先我是一个咸鱼,对技术有一些热爱,也喜欢看一些优秀代码的设计。没有啥很高的追求。
今天面试了一家公司,基本的面试流程,就是介绍,然后开始问ConcurrentHashMap、HashMap、Spring 启动流程等等,本人是一个不喜欢背诵八股文的,佛系面试,差不多得了,所以面试的结果可想而知,所以又一次对源码阅读产生了疑问,所以记录下来。
我把阅读源码分为了几个阶段:
- 阅读 API ,可以不认为是阅读源码的阶段。
- 学习优秀的设计,看看别人是怎么写代码的。
- 为了面试,不知道什么时候一个 HashMap 会被问到烂,到目前为止我都没背过,源码倒是阅读过很多次,但是记不住。。。
所以想从一些高频面试题中试图找到答案:
HashMap
HashMap 因为优秀的设计和使用的范围之大,属
这个阶段是为了使用,也是必须的阶段,例如你得知道 HashMap 是线程不安全的,ConcurrentHashMap 是线程安全的,具体的使用场景是什么。
为什么阅读源码
阅读源码如果只是死记硬背,说实话,没有任何意义。但是不死记硬背,面试又通过不了。
阅读源码或者说阅读API一般分为两个阶段:
- 为了使用,例如 HashMap 你应该知道的是它是线程不安全的,这个是必须的,至于为什么不安全,意义在哪?
- 为了面试,例如 HashMap 的数据结构,数组+链表,数组+链表+红黑树,说句实话,你知道或者不知道,对于大多数的公司,意义不大,因为不可能让你自己设计一个 HashMap 去使用。
例如下面这段代码:HashMap 链表到红黑树的转换
// 遍历链表
for (int binCount = 0; ; ++binCount) {
// 遍历到链表最后一个节点
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null);
// 如果链表元素个数大于等于TREEIFY_THRESHOLD(8)
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
// 红黑树转换(并不会直接转换成红黑树)
treeifyBin(tab, hash);
break;
}
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
你读一遍和读十几遍的意义,在于面试的时候能够回答的好一点,其他的,才疏学浅,真不知道有什么意义。难道你会控制 HashMap 的初始值?