秒速赛车开奖集团-广州秒速赛车幼儿幼教企业【秒速赛车平台】官网欢迎您!

资讯热线:
400-888-8888

秒速赛车公司新闻

秒速赛车平台:& 运算后就是高位值全部归

  秒速赛车平台HashMap是我们在Java中用来保存key-value值使用频率较高的一个工具,其本身是对数据结构哈希表的一个具体实现,本文主要是以源码为主来解决我们下面提出的问题

  1、HashMap是如何将一个对象的hashCode转换为数组中的索引?

  一、HashMap是如何将一个对象的hashCode转换为数组中的索引?

  4、将本身的hashcode与位移后的hashcode进行了一个^运算,得出结果

  步骤3和步骤四是将已经获取到的hashcode进行了一个高低位的干扰运算。秒速赛车平台:

  直接用来当作索引的话hashmap的默认容量就需要40Y个了,但是我们知道hashmap的初始空间为16。

  & 运算后就是高位值全部归零,只使用低位值来保证得到的索引是不超过当前数组的长度的。

  (这里也就说明了为什么扩容是扩2次幂,因为这样数组的长度减1之后得到的二进制位尾数都是1)

  但是这样问题就来了,两个完全不一样的hashcode,但是低位相同就会发生冲突,所以就有了步骤三和步骤四。

  3、判断当前的key值和发生冲突位置的key值是否相等,相等稍后直接覆盖

  上面步骤就是将元素添加到哈希表中的过程,其中3-4-5-6是就是解决冲突的方法。

  首先是在put方法刚开始时,哈希表未初始化时则进行扩容,其次就是在添加完成后

  当前的数组长度已经大于threshold(数组长度*0.75)则进行扩容。

  所以我们需要提前对数组进行扩容。默认的0.75的在效率和内存空间上的一个平衡点。

  HashMap本身是线程不安全的,在多线程环境下会导致丢失数据,在JDK1.8之前扩容操作还会死循环,CPU飙升100%。

  JDK1.7中出现死循环的原因主要是链表在转移数据的过程中,多线程环境下出现环形链表导致的,在JDK1.8中已经使用双链表解决了。

  但是在多线程环境下还是不要使用,也不用加同步(锁全部对象导致效率差),直接使用ConcurrentHashMap来解决

相关文章

主营:教育加盟,幼教加盟,开办幼儿园,幼儿园连锁加盟,早教加盟,早教中心,亲子加盟,幼儿园加盟
Copyright © 2014-2018 广州秒速赛车幼儿幼教企业 版权所有    粤ICP备9742112-1|网站地图
服务热线:400-888-8888  地址:深圳市海淀区中关村国际大厦

友情链接: