当前位置: 首页 > news >正文

三网合一网站建设合同中信建设有限责任公司 湖南中筑建设公司

三网合一网站建设合同,中信建设有限责任公司 湖南中筑建设公司,河北云网站建设,智能小程序下载在 Java 中#xff0c;Map 是属于 java.util 包下的一个接口#xff08;interface#xff09;#xff0c;所以说“为什么 Map 不能插入 null#xff1f;”这个问题本身问的不严谨。Map 部分类关系图如下#xff1a; 所以#xff0c;这里面试官其实想问的是#xff1a;为…在 Java 中Map 是属于 java.util 包下的一个接口interface所以说“为什么 Map 不能插入 null”这个问题本身问的不严谨。Map 部分类关系图如下 所以这里面试官其实想问的是为什么 ConcurrentHashMap 不能插入 null 1.HashMap和ConcurrentHashMap的区别 HashMap 和 ConcurrentHashMap 在对待 null 的态度上是不同的在 Java 中HashMap 是允许 key 和 value 值都为 null 的如下代码所示 HashMapString, Object map  new HashMap(); map.put(null, null); if (map.containsKey(null)) {System.out.println(存在 null); } else {System.out.println(不存在 null); }以上程序的执行结果如下 “ 存在 null 从上述结果可以看出HashMap 是允许  key 和 value 值都为 null 的。 但 ConcurrentHashMap 就不同了它不但 key 不能为 null而且 value 也不能为 null如以下代码所示 ConcurrentHashMapString, String concurrentHashMap  new ConcurrentHashMap(); concurrentHashMap.put(null, javacn.site); System.out.println(concurrentHashMap.get(null));在运行以上程序时就会报错如下图所示 当然当你为 ConcurrentHashMap 的 value 值设置 null 时也会报错如下代码所示 String key  www.avacn.site; ConcurrentHashMapString, String concurrentHashMap  new ConcurrentHashMap(); concurrentHashMap.put(key, null); System.out.println(concurrentHashMap.get(key));在运行以上程序时就会报错如下图所示 因此我们可以得出结论 在 HashMap 中key 和 value 值都可以为 null。 在 ConcurrentHashMap 中key 或者是 value 值都不能为 null。 2.为什么不能插入null 如果我们查看 ConcurrentHashMap 的源码就能发现为什么 ConcurrentHashMap 不能插入 null 了以下是 ConcurrentHashMap 添加元素时的部分核心源码 // 添加 key 和 value public V put(K key, V value) {return putVal(key, value, false); } final V putVal(K key, V value, boolean onlyIfAbsent) {// 如果 key 或 value 为 null 的话直接抛出空指针异常if (key  null || value  null) throw new NullPointerException();int hash  spread(key.hashCode());int binCount  0;// 忽略其他代码...... }从上述 ConcurrentHashMap 添加元素的第一行源码就可以看出当 key 或 value 为 null 时会直接抛出空指针异常这就是 ConcurrentHashMap 之所以不能插入 null 的根本原因了因为源码就是这样设计的。 3.更深层次的原因 那么问题来了为什么 ConcurrentHashMap 的实现源码中不允许为 key 或者是 value 设置 null 呢 这就要从 ConcurrentHashMap 的使用场景说起了在 Java 中ConcurrentHashMap 是用于并发环境中执行的线程安全的容器而 HashMap 是用于单线程环境下执行的非线程安全的容器而并发环境下的运行更复杂如果我们允许 ConcurrentHashMap 的 key 或者是 value 为 null 的情况下就会存在经典的“二义性问题”。 3.1 什么是二义性问题 所谓的二义性问题指的是代码或表达式存在多种理解或解释导致程序的含义不明确或模糊。 以 ConcurrentHashMap 不允许为 null 的二义性问题来说null 其实有以下两层含义 这个值本身设置的是 nullnull 在这里表示的是一种具体的“null”值状态。 null 还表示“没有”的意思因为没有设置所以啥也没有。 所以如果 ConcurrentHashMap 允许插入 null 值那么就会存在二义性问题。 那就有同学会问了为什么 HashMap 允许插入 null它就不怕有二义性问题吗 3.1 可证伪的HashMap HashMap 之所以不怕二义性问题的原因是HashMap 的设计是给单线程使用的而单线程下的二义性问题是能被证明真伪的所以也就不存在二义性问题了能被证明的问题就不是二义性问题。 例如当我们给 HashMap 的 key 设置为 null 时我们可以通过 hashMap.containsKey(key) 的方法来区分这个 null 值到底是存入的 null还是压根不存在的 null这样二义性问题就得到了解决所以 HashMap 的二义性问题可被证明真伪所以就不怕二义性问题因此也就可以给 key 或者 value 设置 null 了。 3.2 不可证伪的ConcurrentHashMap 而 ConcurrentHashMap 就不一样了因为 ConcurrentHashMap 是设计在多线程下使用的而多线程下的二义性问题是不能被证明真伪的所以二义性问题是真实存在的。 因为在你在证明二义性问题的同时可能会有另一个线程影响你的执行结果所以它的二义性问题就一直存在。 例如当 ConcurrentHashMap 未设置 key 为 null 时会有这样一个场景当一个线程 A 调用了 concurrentHashMap.containsKey(key)我们期望返回的结果是 false但在我们调用 concurrentHashMap.containsKey(key) 之后未返回结果之前线程 B 又调用了 concurrentHashMap.put(key,null) 存入了 null 值那么线程 A 最终返回的结果就是 true 了这个结果和我们之前预想的 false 完全不一样这就是不能被证伪的二义性问题。 所以说多线程的执行比较复杂在多线程下 null 的二义性问题是不能被证明真伪的因为在一个线程执行验证时可能会有另一个线程改动结果造成结果不准确所以 ConcurrentHashMap 为了避免这个二义性问题所以就在源码中禁用了 null 值作为 key 或 value。
http://www.w-s-a.com/news/359830/

相关文章:

  • 做网站 租服务器温岭建设公司网站
  • 四川住房和城乡建设厅网站官网做网站最贵
  • 右玉网站建设四川林峰脉建设工程有限公司网站
  • 网站推广小助手杭州百度百家号seo优化排名
  • 怎么做网站搜索框搜索网站备案拍照背景幕布
  • 建设部网站城市规划资质标准伊春网络推广
  • 如何设计酒店网站建设深圳市房地产信息系统平台
  • 伍佰亿网站怎么样网站建设前台后台设计
  • 做整装的网站北京哪个网站制作公司
  • 建设赚钱的网站福州便民生活网
  • 咸阳网站设计建设公司小程序打包成app
  • 做视频网站视频文件都存放在哪做旅游宣传图的网站有哪些
  • 地方门户类网站产品推广惠州市中国建设银行网站
  • 网站建设公司推荐5788移动版wordpress
  • 产品类型 速成网站淘宝怎么建立自己的网站
  • 南京优化网站建设公司的网站怎么建设
  • 做网站开发能挣钱月嫂云商城网站建设
  • 包装网站模板新手入门网站建设
  • 做网站的天津哪个公司做网站
  • 网站建设摊销时间是多久微信官网免费下载安装
  • 网站解析是做a记录吗群晖 wordpress 阿里云
  • 涉县移动网站建设公司常州做网站的公司有哪些
  • 网站批量创建程序中国十大人力资源公司
  • 菏泽网站建设 梧桐树二次开发创造作用
  • 维护网站费用长沙广告设计公司排名
  • 模仿别人网站侵权wordpress 修改链接失效
  • wordpress文章设置受密码保护南宁网站优化公司哪家好
  • 网站开发工程师介绍设计类的网站
  • 嘉兴seo网站推广中山建网站多少钱
  • 高端汽车网站建设帮别人做网站自己为什么会被抓