山东省建设管理信息网站,留号码的广告网站不需要验证码,不同企业的网络营销网站,发帖子有哪些app平台1.HashMap的存储方式是数组加链表#xff0c;主干是一个Entry数组。Entry是HashMap的基本组成单元#xff0c;每一个Entry包含一个key-value键值对#xff1b;当不同的key经过hash计算得出的index值相同时#xff0c;就需要在数组里添加一个链表来存储index相同的元素…1.HashMap的存储方式是数组加链表主干是一个Entry数组。Entry是HashMap的基本组成单元每一个Entry包含一个key-value键值对当不同的key经过hash计算得出的index值相同时就需要在数组里添加一个链表来存储index相同的元素HashMap的整体结构如下 简单来说HashMap由数组链表组成的数组是HashMap的主体链表则是主要为了解决哈希冲突而存在的如果定位到的数组位置不含链表当前entry的next指向null,那么对于查找添加等操作很快仅需一次寻址即可如果定位到的数组包含链表对于添加操作其时间复杂度为O(n)首先遍历链表存在即覆盖否则新增对于查找操作来讲仍需遍历链表然后通过key对象的equals方法逐一比对查找。所以性能考虑HashMap中的链表出现越少性能才会越好。
2.需要注意的是新来的Entry节点插入链表时使用的是“头插法”。之所以把新来的节点放在头节点是因为HashMap的发明者认为后插入的Entry被查找的可能性更大这就是HashMap的底层原理
HashMap的默认初始长度是16并且每次自动扩展或是手动初始化时长度必须是2的幂
初始长度16是为了服务于从Key映射到index的Hash算法
从Key映射到HashMap数组的对应位置会用到一个Hash函数比如调用 hashMap.put(book, 0) 插入一个Key为“book的元素。这时候我们需要利用一个哈希函数来确定Entry的插入位置index
index Hash“book”---- index HashCodeKey Length - 1//这里Key为bookLength是HashMap的长度
整个过程如下
1计算book的hashcode结果为十进制的3029737二进制的101110001110101110 1001。
2假定HashMap长度是默认的16计算Length-1的结果为十进制的15二进制的1111。
3把以上两个结果做与运算101110001110101110 1001 1111 1001十进制是9所以 index9。可以说Hash算法最终得到的index结果完全取决于Key的Hashcode值的最后几位。
假设HashMap的长度是10重复刚才的运算步骤 单独看这个结果表面上并没有问题。我们再来尝试一个新的HashCode 101110001110101110 1011 再换一个HashCode 101110001110101110 1111 试试 虽然HashCode的倒数第二第三位从0变成了1但是运算的结果都是1001。也就是说当HashMap长度为10的时候有些index结果的出现几率会更大而有些index结果永远不会出现比如0111
这样显然不符合Hash算法均匀分布的原则。
反观长度16或者其他2的幂Length-1的值是所有二进制位全为1这种情况下index的结果等同于HashCode后几位的值。只要输入的HashCode本身分布均匀Hash算法的结果就是均匀的。
这点也涉及到了JAVA中hashCode()与equals()区别与作用hashCode也可以用来比较对象是否相同且效率高于equalsequals的效率很低下。但hashCode()并不是完全可靠不同的对象也可能生成相同的hashcode而equals是完全可靠的。 所有对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低所以解决方式是每当需要对比的时候首先用hashCode()去对比如果hashCode()不一样则表示这两个对象肯定不相等也就是不必再用equal()去再对比了,如果hashCode()相同此时再对比他们的equal()如果equal()也相同则表示这两个对象是真的相同了这样既能大大提高了效率也保证了对比的绝对正确性
hashCode值的计算方式具体可以参考不同版本的jdk api内的 hashCode函数
3.HashMap非线程安全
1Hashmap在插入元素过多的时候需要进行ResizeResize的条件是
HashMap.Size Capacity * LoadFactor。
2Hashmap的Resize包含扩容和ReHash两个步骤ReHash在并发的情况下可能会形成链表环。 https://blog.csdn.net/wufaliang003/article/details/80219296