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

建网站用什么工具邵阳县网络推广

建网站用什么工具,邵阳县网络推广,学校网站 asp,衡阳退休职工做面膜网站写在开头 今天在写《HashMap很美好#xff0c;但线程不安全怎么办#xff1f;ConcurrentHashMap告诉你答案#xff01;》这篇文章的时候#xff0c;漏了一个知识点#xff0c;知道晚上吃饭的时候才凸显想到#xff0c;关于ConcurrentHashMap在存储Key与Value的时候…写在开头 今天在写《HashMap很美好但线程不安全怎么办ConcurrentHashMap告诉你答案》这篇文章的时候漏了一个知识点知道晚上吃饭的时候才凸显想到关于ConcurrentHashMap在存储Key与Value的时候是否可以存null的问题按理说这是一个小问题但build哥却不敢忽视尤其在现在很多面试官都极具挑剔的环境下万一同学们刷到了咱的博客回答中遗漏了这个小细节错过了面试官的考验那咱可就成罪人了。 接下来我们就将HashMap、Hashtable、ConcurrentHashMap这三集合类的键值是否可以null的问题放一起对比去学习一下。 Hashtable的键值与null 虽然我们在讲解HashMap与Hashtable作对比时已经说了Hashtable在存储key与value时均不可为null但当时的侧重点全在HashMap身上就没有详细的解释原因下面我们跟进put源码中去一探缘由。 【源码解析1】 public synchronized V put(K key, V value) {// 确认值不为空if (value null) {throw new NullPointerException(); // 如果值为null则抛出空指针异常}// 确认值之前不存在Hashtable里Entry?,? tab[] table;int hash key.hashCode(); // 如果key如果为null调用这个方法会抛出空指针异常int index (hash 0x7FFFFFFF) % tab.length;//计算存储位置//遍历看是否键或值对是否已经存在如果已经存在返回旧值SuppressWarnings(unchecked)EntryK,V entry (EntryK,V)tab[index];for(; entry ! null ; entry entry.next) {if ((entry.hash hash) entry.key.equals(key)) {V old entry.value;entry.value value;return old;}}addEntry(hash, key, value, index);return null;}通过Hashtable的put底层源码我们可以看到方法体内首先就对value值进行的判空操作如果为空则抛出空指针异常其次在计算hash值的时候直接调用key的hashCode()方法若keynull自然也会报空指针异常因此我们在调用put方法存储键值对时key与value都非null。 HashMap的键值与null 我们同样也通过HashMap的put方法去分析它的底层源码先上代码。 【源码解析2-hash()】 static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hashCode()) ^ (h 16); }在计算hash值的时候hashmap中通过三目运算符做了空值处理直接返回0这样最终计算出key应该存储在数组的第一位上且key是唯一性呢因此key最多存一个null 【源码解析3】 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {// 数组HashMap.NodeK,V[] tab; // 元素HashMap.NodeK,V p; // n 为数组的长度 i 为下标int n, i;// 数组为空的时候if ((tab table) null || (n tab.length) 0)// 第一次扩容后的数组长度n (tab resize()).length;// 计算节点的插入位置如果该位置为空则新建一个节点插入if ((p tab[i (n - 1) hash]) null)tab[i] newNode(hash, key, value, null);/// }回归putVal()方法我们逐句阅读后也没有发现对于value值为null的处理与限定因此它可以存储为null的value值我们知道HashMap的键值对特点如同身份证与人名一样key等同于身份证全国唯一而value值等同于人名可以重复比如全国有上万个叫张伟的所以value值也就同样允许存储多个null。 ConcurrentHashMap的键值与null 很多同学们可能会以为ConcurrentHashMap不过是HashMap在多线程环境下的版本底层实现都一致只是多了加锁的操作所以二者对于null的允许程度是一样。 如果你是这样想那可就完全错了对于ConcurrentHashMap来说它也不允许存储键值对为null的数据。 Doug LeaConcurrentHashMap的设计者曾这样说道 The main reason that nulls aren’t allowed in ConcurrentMaps (ConcurrentHashMaps, ConcurrentSkipListMaps) is that ambiguities that may be just barely tolerable in non-concurrent maps can’t be accommodated. The main one is that if map.get(key) returns null, you can’t detect whether the key explicitly maps to null vs the key isn’t mapped. In a non-concurrent map, you can check this via map.contains(key), but in a concurrent one, the map might have changed between calls. 大致的意思是在单线程环境中不会存在一个线程操作该 HashMap 时其他的线程将该 HashMap 修改的情况可以通过 contains(key)来做判断是否存在这个键值对从而做相应的处理 而在多线程环境下可能会存在多个线程同时修改键值对的情况这时是无法通过contains(key)来判断键值对是否存在的这会带来一个二义性的问题Doug Lea说二义性是多线程中不能容忍的 啥是二义性 咱们通俗点讲就是一个结果2种释义就好比我们通过get方法获取值的时候返回一个null其实我们是无法判断是值本身为null还是说集合中就没这个值 所以说ConcurrentHashMap的key和value均不可为null。 结尾彩蛋 如果本篇博客对您有一定的帮助大家记得留言点赞收藏呀。原创不易转载请联系Build哥 如果您想与Build哥的关系更近一步还可以关注俺滴公众号“JavaBuild888”在这里除了看到《Java成长计划》系列博文还有提升工作效率的小笔记、读书心得、大厂面经、人生感悟等等欢迎您的加入
http://www.pierceye.com/news/902856/

相关文章:

  • 上海网站设计合理柚v米科技济南网站优化公司电话
  • 卓拙科技做网站吗怎么用php做网站后台程序
  • 山东企业建站系统费用抚宁区建设局网站
  • 免费购物网站程序国外公共空间设计网站
  • 网站 选项卡 图标网站 关键词
  • 怎样在各大网站做有效的宣传抽奖网站怎么做的
  • 建立网站需要多少钱 索 圈湖南岚鸿新开传奇网站合击
  • 快手官方网站音乐人怎么做商城建站系统源码
  • 南充市建设厅官方网站高州做网站
  • 自建网站的优缺点wordpress题库制作
  • 哪家公司做网站毕业设计心理评测网站开发
  • 建设电影网站数据库脚本问答网站如何优化
  • 嘉峪关建设路小学网站游戏网页链接
  • 阿里云 网站根目录广东建筑企业50强
  • 河北省网络科技网站装饰设计素描
  • 合肥网站建设索q479185700企业做网站公司哪家好
  • wordpress暂停网站兰州网站建设方法
  • 丰台网站制作html教程 菜鸟教程
  • 在那个网站做直播好赚钱吗重庆妇科医院排名大全
  • 在线教育网站建设投标书查询公司的网站备案信息查询
  • 俄文网站策划wdcp wordpress
  • 建设个人网站流程中国工程建设招聘信息网站
  • 电影网站设计说明书在原域名给公司建立网站
  • 小规模公司做网站成本是什么wordpress主题转html
  • seo做的比较好的网站的几个特征app网站建设教程视频教程
  • 网站建设规范优质高等职业院校建设网站
  • 国内做网站哪家公司好机票什么网站建设
  • 万盛经开区建设局官方网站高校校园网站建设的要求
  • 制作企业网站的实训报告防伪码查询网站怎么做的
  • 做网站会很忙吗网站 js 广告代码