阅读源码到底有没有没有意义

首先我是一个咸鱼,对技术有一些热爱,也喜欢看一些优秀代码的设计。没有啥很高的追求。

今天面试了一家公司,基本的面试流程,就是介绍,然后开始问ConcurrentHashMap、HashMap、Spring 启动流程等等,本人是一个不喜欢背诵八股文的,佛系面试,差不多得了,所以面试的结果可想而知,所以又一次对源码阅读产生了疑问,所以记录下来。

我把阅读源码分为了几个阶段:

  1. 阅读 API ,可以不认为是阅读源码的阶段。
  2. 学习优秀的设计,看看别人是怎么写代码的。
  3. 为了面试,不知道什么时候一个 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 的初始值?

Last Updated:
Contributors: 拔土豆的程序员