HashMap内部实现解读--菜鸟版

HashMap: 

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。

HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。

HashMap 内部存储使用的一个数组存在值,数组中存储着一个对象 Entry

HashMap内部实现解读--菜鸟版_第1张图片

 从调试中得到数组默认长度为 16 ,在往HashMap中添加值超过16之后, HashMap以原数组的长度的2倍进行增长

HashMap内部实现解读--菜鸟版_第2张图片

HashMap创建一个新的数组, 长度为原数组的长度的2倍后,循环原数组中已存的对象,并通过算法获取下标后把原数组中的元素进行转移,最后使用新创建的数组覆盖原始数组,实现数组长度的可变性增长

HashMap内部实现解读--菜鸟版_第3张图片

HashMap中内部的数组长度不能超过一个限制数,即 1073741824 个

ps: "<<" 位移运算 , A << B , 把A 的 2进制位模式 左移 B 位 后得到新的位模式

例如 : 10进制的 4 转为 2 进制 为 100 , 位移运算 4<<2 , 100  左移两位后 =10000  = 10进制 = 16

固定说法 : 一个数左移 一位 就是该数 * 2  , 该数 右移( ">>" ) 则是 除以 2     

既然HashMap是使用数组,那为什么HashMap是无序的呢?

其实,HashMap内部并不是按照数组下标依次存入的,而是通过HashMap自己的算法计算得出的下标

通过传入Key的hash值计算后得出该值应该存储的下标位置

HashMap内部实现解读--菜鸟版_第4张图片

HashMap内部实现解读--菜鸟版_第5张图片

其实就是通过HashMap 的Hash函数计算出hash值后 % 数组长度 余数就是该值存储的下标位置,HashMap在存取值的时候都是根据传入的Key计算下标后进行存取的。

 

HashMap中的 containsKey(Object key)函数用于检测HashMap中是否存在该Key值, 其实HashMap只是把传入的Key安装取值的函数去获取,如果获取到了就是存在该Key,反之亦然

HashMap内部实现解读--菜鸟版_第6张图片

结束语 : 菜鸟闲的无聊,稍微看了下HashMap的存取源码, 其他方法尚未涉及, 如果有哪里说错的,请加以改正,在此谢过!!!

你可能感兴趣的:(java)