
HashMap
文章平均质量分 64
Rick1993
这个作者很懒,什么都没留下…
展开
-
基于1.8的ConcurrentHashMap
ConcurrentHashMap1.8的底层数据结构如下:和1.8的HashMap类似1.8版本抛弃了原有的Segment分段锁技术,而采用了CAS+synchronized来保证并发安全性。也将1.7的HashEntry改为Node,但作用是相同的;其中val和next都用volatile修饰,保证了可见性。Node类如下:static class Node<K,V> im...原创 2019-11-09 14:46:16 · 916 阅读 · 0 评论 -
HashMap添加的对象为什么要重写equals()和hashcode()
首先要了解原生的hashCode和equals是什么样?public native int hashCode();public boolean equals(Object obj) { return (this == obj);}原生的hashCode值是根据内存地址值换算出来的一个值;原生的equals方法是this==obj;也是根据内存地址判断的。...原创 2019-09-24 22:22:10 · 675 阅读 · 0 评论 -
jdk1.7HashMap链表头插法导致的死循环
jdk1.7的HashMap的源码分析参考我之前整理的连接https://blog.youkuaiyun.com/thqtzq/article/details/90146880,之前也有整理头插法导致的死循环,这里再整理一下。参考连接:https://coolshell.cn/articles/9606.html扩容的核心源码如下:void transfer(Entry[] newTable, boole...原创 2019-05-23 18:24:17 · 17960 阅读 · 19 评论 -
基于jdk1.8的HashMap(2)
分析2:putVal(hash(key), key, value, false, true);主要讲解点1:计算完存储位置后,具体该如何存放数据到哈希表中源码分析: /** * 分析2:putVal(hash(key), key, value, false, true) */ final V putVal(int hash, K key, V value, b...原创 2019-05-23 11:31:29 · 183 阅读 · 1 评论 -
基于jdk1.7的HashMap
jdk1.7的HashMap底层有数组加链表实现。原创 2019-05-19 02:07:09 · 548 阅读 · 0 评论 -
手写HashMap
jdk1.7的HashMap的底层实现主要是基于数组和链表来实现的,HashMap中通过key的hashCode来计算hash值的,再由这个hash值计算其在数组中的位置,将新插入的元素放到数组的这个位置,如果新插入的元素的hash值跟这个位置上已有元素的hash值相同,就会出现hash冲突,这时候,就在该位置通过链表来插入新的元素。如下图:具体代码如下:Map接口:public int...原创 2019-05-12 15:44:32 · 196 阅读 · 0 评论 -
基于1.7的ConcurrentHashMap
一个ConcurrentHashMap由一个Segment数组构成,一个Segment由一个HashEntry数组构成,因此整体的ConcurrentHashMap结构如下:可以说,ConcurrentHashMap是一个二级哈希表,在一个总的哈希表下面,有若干个子哈希表。...原创 2019-05-19 16:35:32 · 974 阅读 · 2 评论 -
基于jdk1.8的HashMap(1)
jdk1.7的HashMap底层有数组加链表实现。HashMap的默认初始长度是多少?为什么这么规定?HashMap的默认初始长度为16,并且每次自动扩展或是手动初始化时,长度必须是2的幂。之所以选择16,是为了服务于从key映射到index的Hash算法。取模运算效率较低,为了实现高效率的hash算法,HashMap的发明者采用了位运算的方式。源码如下:(length是HashMap的长度...原创 2019-05-19 03:07:21 · 606 阅读 · 0 评论