当前位置: 首页 > 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.zqtcl.cn/news/902856/

相关文章:

  • html 企业网站模板网站策划书免费
  • 网站建设销售ppt拖拽建站系统源码
  • 网站托管费用多少网站的开发流程
  • 周到的商城网站建设北京品牌网站
  • 网站开发费用属于什么科目网站建设考试多选题
  • c asp做网站wordpress4.5.2文章采集
  • 百度网站建设电话建立网站站建设可以吗
  • 网站后台代码在哪修改网站如何做下一页
  • 网站开发职业要求百度推广代理商与总公司的区别
  • 西安网站建设中心网页 网 址网站区别
  • 技术支持东莞网站建设机械seo岗位是什么意思
  • 做商城网站需要备案什么域名硬件开发工具有哪些
  • 网络网站制作技巧wordpress全文
  • 韩国原生ip站群服务器左右悬停代码网站
  • 专门做广东11选5的网站网站 备案 营业执照
  • 免费扑克网站wordpress弹出服务协议窗口
  • 网站的反爬一般怎样做网站右键屏蔽
  • 茂名做网站dyiee青岛宣传片制作公司
  • 凡科网可以自己做网站吗编程常用网站
  • 做网站练手项目公司营业执照可以做几个网站
  • 聚通达网站建设网站并发要求
  • 网站建设预算申请如何写服装店网页设计素材
  • 做网站设计的公司柳州芜湖又出现一例
  • 重庆网站网站建设东莞市网站建设公司哪家好
  • php做网站如何架构wordpress 排版
  • wordpress免费网站模板下载地址在北京注册公司需要多少钱
  • 做的网站打不开高端网站名字
  • 个人网站建设报告西安网站开发高端网站开发
  • “网站建设:上海珍岛”网站备案信息查询系统
  • 北京哪个公司做网站专业建站培训