(1)hashmap 的结构 key-value结构数据在程序中得到很广泛的应用。比如常用的 redis,Leveldb等都采用这种数据结构。key-value是一种映射关系。映射关系是一种弱依赖关系没有逻辑上的英国关系。对结构进行分解可以分成三种要素 ,分别是 key 对象 和 value对象 ,和一一对应关系。对应关系是构建结构的纽带 。用函数方式表示 y=f(x); x表示 key 对象 y 表示value对象 f(x),表示他么之间的对应关系。通过key-value 结构可以保存含有对应关系的两个对象。结构简单明了易懂,由于内部关系比较简单,这种结构内部计算复杂度不会很高。同时有一些缺点 ,很难表达出多于两者以上对象之间构建的系。 既然是 hashmap 那就离不开 hash 算法 。因为在实际运用场景中,我们面对的是各种各样的对象。长的方的瘪的圆的。不方便处理 ,需要有一个统一转化模型来化归对象 。抽象出对象的统一数字标识。这个时候hash算法能满足这一要求 ,任何一个对象都可以经过hash算法得到唯一的一组数字标识来作为对象标识,做一个计算映射来屏蔽了不同对象之间的不同点。(null 的hash 值默认为0 特列) hashmap 的数据结构随着 存入的数据的变化而变化,开始在没有出现hash冲突的情况下用Node来存放映射的键值对,将node 存放在数组中。 当出现相同的hash 值得时候这个时候会新建一个 Node将当前node 的next指向新建的 Node 对象。 hash算法的概率分布 。
hashmap 创建的时候会有多个构造函数重点解析一下给定容量,和负载因子的构造函数
由于hashmap 默认的最大值不超过最大整数因此构造的最大长度不会超过 2的31次方分配的空间 并不是我们输入的长度而是自己实现了一个算法来计算默认长度
通过“或与”来计算 长度 >>> 位运算是通过无符号右移左边填充0来运算 ,整数的最大值是 2的32 次方 通过 1+2+4+8+16 =32 刚好达到整数的最大次方。让最高位1 后面的其他位数全变成1,这样做还不够,因为如果这个数本身就是2的次方的话,那么我们直接取本身就可以了而不是比自己大的最小2的次方,由于位运算可能会导致负数的出现,这个时候默认为最大整数作为容量。 hashmap在删除元素的时候会适当调整结构比如当hash冲突数据小于6的时候会从树结构转换成链表结构,在由链表结构转成树结构的时候是8,但是由树结构转成链表结构的时候是6,这里主要是基于一些频繁操作的时候,为了防止频繁转换问题,让两者结构互转的时候长度不一样。这种处理方式在百变城中汗多地方都会用到 ,比如缓存的时候设置失效时间,不会专门设置成同一时候。防止同一时候大量操作发生。