莱芜网站建设价格,温州网凝科技有限公司,南宁网站设,上海地区网站建设1、典型回答
浅层次的来回答这个问题的答案是#xff0c;JDK 源码不支持 Hashtable 插入 value 值为 null#xff0c;如以下 JDK 源码所示#xff1a; 也就是 JDK 源码规定了#xff0c;如果你给 Hashtable 插入 value 值为 null 就会抛出空指针异常。
并且看上面的 JDK …1、典型回答
浅层次的来回答这个问题的答案是JDK 源码不支持 Hashtable 插入 value 值为 null如以下 JDK 源码所示 也就是 JDK 源码规定了如果你给 Hashtable 插入 value 值为 null 就会抛出空指针异常。
并且看上面的 JDK 源码可以得出结论如果 key 也为 null 的时候因为 null 没有 hashCode 所以它也会报空指针异常如下图所示 2、考点分析
简单来说Hashtable 之所以 key 不允许为 null和 value 不允许为 nul 的原因是JDK 源码级别做了限制如果 Hashtable 的 key 或者 value 为 null 就会报空指针异常。
3、知识扩展
但是我们看 JDK 源码不难发现这些判断和错误 Hashtable 完全可以在后续的 JDK 版本中修复和调整代码可以让其支持 key 和 value 都为 nul为什么它没有修复这个问题呢
深层次的原因就是设计的 Hashtable 是在多线程下使用的而如果 Hashtable 的 key 或 value 允许为 null 的话那么程序就会存在二义性问题。
什么是二义性问题?
所谓的二义性问题是指含义不清或不明确。
如果我们假设 Hashtable 允许插入 null那么此时它就会有二义性问题这个 nu! 值就有两层含义
这个 key 不存在所以返回 null。key 存在并且值本身就为 nul所以返回的就是 null。
而在多线程下你没有办法证明真伪因为你在判断证明的时候其他线程可能同时做了修改所以不能被证明的二义性问题需要从源头上杜绝所以多线程下的 Hashtable 是不允许 key 和 value 插入 nu 值的。
ConcurrentHashMap 也是不允许插入 null原因和 Hashtable 是一样的因为有二义性问题
为什么 HashMap 允许插入 null 值?
因为 HashMap 设计是在单线程下使用的而单线程可以证明真伪它在进行查询判断的时候不用担心有其他线程对这个值同时做修改所以它不存在二义性问题所以 HashMap 允许 key 和 value 都为 null。