【无标题】hashmap和currenthashmap底层原理
HashMap 和 ConcurrentHashMap 都是 Java 中的 Map 接口的实现类,它们都可以存储键值对。
HashMap 的实现原理是通过哈希表来实现的,它使用了数组和链表来存储键值对。当向 HashMap 中添加元素时,HashMap 会先计算出键的哈希值,然后根据这个哈希值将元素存储到相应的桶(数组中的一个位置)中。如果多个元素的哈希值相同,那么它们会被存储在同一个桶中,使用链表来存储这些元素。在查询时,HashMap 会先计算出键的哈希值,然后根据这个哈希值找到对应的桶,然后在这个桶中查找对应的元素。
ConcurrentHashMap 的实现原理也是通过哈希表来实现的,它使用了数组和链表(或红黑树)来存储键值对。它的主要特点是支持并发访问,它使用了一种叫做分段锁(Segment)的技术来实现并发访问。ConcurrentHashMap 将整个哈希表分成多个小的哈希表段,每个段都有自己的锁。在添加或查询元素时,只需要锁住对应的段,而不是锁住整个哈希表。这种方式可以大大提高并发访问的效率。
总的来说,HashMap 是线程不安全的,它适合于单线程环境下使用。而 ConcurrentHashMap 则是线程安全的,它适合于多线程环境下使用。但是在高并发的情况下,ConcurrentHashMap 的效率要比 HashMap 高得多。
hashmap 和hashtable 和currenthahsmap底层组成
HashMap、Hashtable、ConcurrentHashMap 都是 Java 中的 Map 接口的实现类,它们都可以存储键值对。它们的底层组成如下:
HashMap 的底层实现是数组和链表(或红黑树),数组用于存储元素,链表用于解决哈希冲突。
Hashtable 的底层实现和 HashMap 类似,采用了哈希表的方式来存储元素。不同的是,Hashtable 是线程安全的,它的所有方法都是同步的。
ConcurrentHashMap 的底层实现是由若干个 Segment 组成的数组,每个 Segment 就是一个哈希表。每个 Segment 有自己的锁,不同的 Segment 可以被多个线程同时访问,因此它可以提高并发性能。在 JDK8 中,ConcurrentHashMap 的底层实现使用了一种叫做 CAS(CompareAndSwap)的无锁算法,这使得它在高并发情况下的性能得到了极大的提升。
总的来说,HashMap 使用了链表和红黑树来解决哈希冲突,它是线程不安全的;Hashtable 使用了 synchronized 关键字来保证线程安全,它的效率比 HashMap 低;ConcurrentHashMap 使用了分段锁的技术来保证线程安全,它是在多线程环境下效率最高的 Map 实现类。
点击复制后,将打开C知道体验页 |
current hashmap 红黑树
点击复制后,将打开C知道体验页
ConcurrentHashMap 在 JDK1.8 版本中引入了红黑树(Red-Black Tree)的支持,这是因为在高并发情况下,ConcurrentHashMap 中的某个桶(bucket)中的链表可能会很长,这会影响到查找、删除、插入等操作的效率。因此,当链表的长度超过一定阈值时,ConcurrentHashMap 会将链表转换为红黑树,这样可以提高查找、删除、插入等操作的效率。
红黑树是一种自平衡的二叉查找树,它的特点是:
每个节点要么是红色,要么是黑色。
根节点是黑色的。
每个叶子节点(NIL节点,空节点)是黑色的。
如果一个节点是红色的,则它的子节点必须是黑色的。
从任意一个节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。
红黑树的平衡性能够保证在最坏情况下的时间复杂度为O(log n),这使得红黑树可以高效地支持插入、删除、查找等操作。
在 ConcurrentHashMap 中,当链表的长度超过一个阈值(默认为8)时,会将链表转换为红黑树。这样可以将查找、删除、插入等操作的时间复杂度从O(n)降低到O(log n),从而提高了并发性能。但是,在数据量较小的情况下,使用红黑树反而会降低性能,因此 ConcurrentHashMap 会根据数据量的大小自动选择使用链表还是红黑树。