这道面试题我真不知道面试官想要的回答是什么
持续输出原创文章,关注我吧
面试是一个很奇怪的过程,都是拧螺丝的。但是问的都是如何造火箭,一个敢问,一个敢答。
面试不可怕,可怕的是你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的问题写过邮件咨询过,而他老爷子亲自回答了这个问题。
本文在翻译四封相关邮件的过程中,结合老爷子的邮件,加上自己的理解来回答这个问题。
说明:本人英文水平有限,翻译出来的文章大家看的时候多多包涵。同时我也附上原文和邮件地址,大家可以访问。
第一封:Tutika求助
邮件地址:http://cs.oswego.edu/pipermail/concurrency-interest/2006-May/002482.html
2006年5月12日早上06点01分45秒,一位名叫Tutika的网友发出了"求助"邮件:
邮件内容如下:
全文翻译过来,大概就是:
大家好,我想把我一个多线程的项目里面一些HashMap用ConcurrentHashMap替换掉。在HashMap里面我可以放key或者value为null的数据,没有任何毛病。但是ConcurrentHashMap的key和value都不允许为null。
我想知道针对这一问题,有没有比较好的解决方式。需要说明一下的是,在我的应用程序中,对于值为null的value和key是非常难以判断的。
我的解决方案是想包装一下ConcurrentHashMap,当插入null值的时候用其他的对象来代替,取出该对象时再转换为null。但是这个解决方案的问题是在比如keySet(),values()这样的批量操作的方法中,进行对应的转换是非常困难的。
如果有人对于这个问题有解决思路,请告诉我。这将对我非常有用。
翻译结束。
这里我想插个题外话,关于提问的艺术,我觉得Tutika同学的提问方式就很标准。在什么场景下遇到了什么问题,自己尝试的解决方案是什么,请问有没有更好的解决方案?
好好看看下面的图,别一上来就是:有人吗?在吗?
第二封:热心网友
邮件地址:http://cs.oswego.edu/pipermail/concurrency-interest/2006-May/002484.html
Tutika发出"求救"邮件后的1小时20分18秒,就有热心网友Holger回复了他的问题,