面试是一个很奇怪的过程,都是拧螺丝的。但是问的都是如何造火箭,一个敢问,一个敢答。
面试不可怕,可怕的是你get不到面试官的点。
更可怕的是,你觉得你知道答案,但不是面试官想要的。
最可怕的是,面试官也不知道这题的答案是什么。
送分题?送命题?
前段时间有个小伙伴在一个群里分享了一道亲身经历的面试题,这题乍一看好像张口就能答,但是仔细一想,面试官是想要这样的回答吗?具体可以看截图。
可以想象一下那个略显尴尬的画面:
面试官:请问ConcurrentHashMap中的key为什么不能为null?
面试者:因为源码里面就是这样写的,判断为空,抛出异常。
面试官:没了?
面试者:没了。
我前思后想,对于这个问题我是真的不知道面试官想要什么样的答案。就算我写完这篇文章之后,我知道了前因后果,我还是不清楚怎么回答他的这个问题。因为我get不到他的点在哪里。
具体怎么回事,看完本文之后,你就知道了。
我提炼并升华一下这个面试题,请问:
ConcurrentHashMap为什么不能存值为null的value?
ConcurrentHashMap为什么不能放值为null的key?
SHOW ME THE CODE
我们先看一下当ConcurrentHashMap的key和value分别都为null的时候,程序的执行结果是什么:
可以看到,这里抛出了空指针异常,因为ConcurrentHashMap里面的key和value是都不能为null的。
其对应的源码部分如下(JDK 1.8):
有的时候,你看到源码说明你看的很深入了;
有的时候,你看到源码了,只是看到了表象。
比如这个地方,源码为什么这样写?或者换个问法,作者这样写是基于什么考虑的?
if (key == null || value == null) throw new NullPointerException();
要知道作者这样写的出发点是什么,最权威的回答就是作者自己的回答。而ConcureentHashMap就是巨佬Doug Lea老爷子写的。
Doug Lea是谁?java.util.concurrent包你知道吧?他写的 。
俗话说得好:编程不识Doug Lea,写尽Java也枉然。
知道他是谁了,接下来就好办了。因为早在2006年就有人针对ConcurrentHashMap的key和value为什么不能为null的问题写过邮件咨询过,而他老爷子亲自回答了这个问题。
本文在翻译四封相关邮件的过程中,结合老爷子的邮件,加上自己的理解来回答这个问题。
说明:本人英文水平有限,翻译出来的文章大家看的时候多多包涵。同时我也附上原文和邮件地址,大家可以访问。