首页 > 其他分享 >HashMap和ConcurrentHashMap

HashMap和ConcurrentHashMap

时间:2023-07-15 15:33:17浏览次数:28  
标签:key ConcurrentHashMap 单链 HashMap 结点 hashCode 数组

HashMap

结构
桶数组+单链表+红黑树(JDK1.8引入)

容量是2的幂的原因
寻找位置时,(n - 1)& hashCode值等价于hash%n,但是&比%具有更高的效率。
得到key的hashCode值后,通过二次hash(第一次hash时右移 16 位,hashCode值高16位与低16位异或操作,高16位保持不变;第二次hash时(n - 1)& hashCode值)来减少冲突。
异或操作指,值不同时是1,值相同时是0。

属性
1 树形化阈值
单链表长度达到8时把该单链表转换成红黑树,因为结点数较多时红黑树查询效率优于单链表。
2 反树形化阈值
红黑树结点数减少到6时把该红黑树转换成单链表,因为单链表结点比红黑树结点更省空间,而且结点较少时单链表查询效率高。
3 最小树形化数组容量阈值
单链表需要转换成红黑树时,如果桶数组容量<64,则不执行转换,通过扩容来处理桶数组容量太小(小于64)导致的hash冲突。
4 默认负载因子0.75
负载因子=key总数/桶总数。这是时间和空间成本上的折中方案。负载因子高虽然减少空间成本,但会增加查询时间成本。负载因子低虽然减小查询时间成本,但会增加空间成本,频繁的扩容会降低性能。

扩容机制即resize方法
返回重组结点后的新的桶数组
桶数组旧容量的2倍作为桶数组新容量,键值对数量旧阈值的2倍作为键值对数量新阈值。
重组结点时使用尾插法,保证结点的相对次序与原来相同。

ConcurrentHashMap

为什么key和value均为非空?(Hashtable也是如此)
key非空:putVal方法中通过key的hashCode方法来获取散列码。
value非空:作为支持并发的类,调用get方法获得指定key对应的value时,如果为空,则无法判断产生的原因即put操作还是不存在该key。对于不支持并发的HashMap,可以通过调用contains方法来判断;对于支持并发的Map,调用contains方法(存在该key)和调用get方法(不存在该key)的对象已经不同,即不能通过contains方法来判断是否存在该key,下一时刻map可能会变。

1.7基本结构

1.8改进(整体结构与HashMap类似)
取消segments属性,通过桶数组来保存数据。桶数组元素对应的单链表或红黑树首结点作为锁,相当于对每一行数据加锁,进一步减小锁粒度。
桶数组+单向链表的数据结构变为桶数组+单链表+红黑树。

标签:key,ConcurrentHashMap,单链,HashMap,结点,hashCode,数组
From: https://www.cnblogs.com/WJQ2017/p/17556194.html

相关文章

  • HashMap里面有哪些方法会更改modCount
    modCount是 HashMap 类中的一个成员变量,用于记录 HashMap 结构发生变更(如插入、删除、扩容等操作)的次数。在 HashMap 中,有以下方法会更改modCount的值:1.put(K key, V value):插入一个新的键值对。2.putAll(Map<? extends K, ? extends V> m):将一个 Map 中的所......
  • HashMap 源码阅读
    HashMap源码阅读HashMap是线程不安全的,若需要考虑线程安全则需要用HashTable属性//默认大小1<<4为16staticfinalintDEFAULT_INITIAL_CAPACITY=1<<4;//最大2的30次方staticfinalintMAXIMUM_CAPACITY=1<<30;//默认负载因子0.75staticfinal......
  • HashMap的实现原理详解(看这篇就够了)
    一线资深java工程师明确了需要精通集合容器,尤其是今天我谈到的HashMap。HashMap在Java集合的重要性不亚于Volatile在并发编程的重要性(可见性与有序性)。我会重点讲解以下9点:1.HashMap的数据结构2.HashMap核心成员3.HashMapd的Node数组4.HashMap的数据存储5.HashMap的哈希函数6.哈......
  • HashMap的实现原理详解(看这篇就够了)
     一线资深java工程师明确了需要精通集合容器,尤其是今天我谈到的HashMap。HashMap在Java集合的重要性不亚于Volatile在并发编程的重要性(可见性与有序性)。我会重点讲解以下9点:1.HashMap的数据结构2.HashMap核心成员3.HashMapd的Node数组4.HashMap的数据存储5.HashMap......
  • HashMap的遍历方法
    Map<String,String>myMap=newHashMap<>();myMap.put("key1","value1");myMap.put("key2","value2");//for循环遍历for(Map.Entry<String,String>entry:myMap.entrySet()){Stringkey=entry.getKe......
  • Java源码系列4——HashMap扩容时究竟对链表和红黑树做了什么?
    Photobyhippopx.com我们知道HashMap的底层是由数组,链表,红黑树组成的,在HashMap做扩容操作时,除了把数组容量扩大为原来的两倍外,还会对所有元素重新计算hash值,因为长度扩大以后,hash值也随之改变。如果是简单的Node对象,只需要重新计算下标放进去就可以了,如果是链表和红黑......
  • java中concurrentHashMAP和HashTable有什么区别?
    ConcurrentHashMap和HashTable都是Java中用于实现线程安全的哈希表数据结构的类,但它们有一些关键的区别。线程安全性:ConcurrentHashMap是通过使用锁分段技术来实现线程安全的。它将整个哈希表分成了多个段(默认为16个),每个段有自己的锁。这样,在大多数情况下,多个线程可以同时访问不同......
  • HashMap底层原理
    一、HashMap底层实现原理解析我们常见的有数据结构有三种结构:数组结构;链表结构;哈希表结构。下面我们来看看各自的数据结构的特点:1)数组结构:存储区间连续、内存占用严重、空间复杂度大优点:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度快)缺点:插入和删除数据......
  • HashMap底层原理
    一、HashMap底层实现原理解析我们常见的有数据结构有三种结构:数组结构;链表结构;哈希表结构。下面我们来看看各自的数据结构的特点:1)数组结构:存储区间连续、内存占用严重、空间复杂度大优点:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度快)缺点:插入和删除数据......
  • HashMap底层原理
    一、HashMap底层实现原理解析我们常见的有数据结构有三种结构:数组结构;链表结构;哈希表结构。下面我们来看看各自的数据结构的特点:1)数组结构:存储区间连续、内存占用严重、空间复杂度大优点:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度快)缺点:插入和删除数据......