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

HashMap: 

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

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

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

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

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

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 的Hash函数计算出hash值后 % 数组长度 余数就是该值存储的下标位置,HashMap在存取值的时候都是根据传入的Key计算下标后进行存取的。

 

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值