java的HashMap知多少

编程入门 行业动态 更新时间:2024-10-28 16:26:59

java的HashMap<a href=https://www.elefans.com/category/jswz/34/1764805.html style=知多少"/>

java的HashMap知多少

首先,我们需要知道HashMap的底层实现是数组、链表、红黑树。 HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快 的访问速度,但遍历顺序却是不确定的。 HashMap 最多只允许一条记录的键为 null,允许多条记 录的值为 null。HashMap 非线程安全,即任一时刻可以有多个线程同时写 HashMap,可能会导 致数据的不一致。如果需要满足线程安全,可以用 Collections 的 synchronizedMap 方法使 HashMap 具有线程安全的能力,或者使用 ConcurrentHashMap。我们用下面这张图来介绍 HashMap 的结构。 JAVA7 实现 大方向上,HashMap 里面是一个数组,然后数组中每个元素是一个单向链表。上图中,每个绿色 的实体是嵌套类 Entry 的实例,Entry 包含四个属性: key, value, hash 值和用于单向链表 的 next。 1. capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍。 2. loadFactor:负载因子,默认为 0.75。 3. threshold:扩容的阈值,等于 capacity * loadFactor 3.4.1.2. JAVA8 实现 Java8 对 HashMap 进行了一些修改, 最大的不同就是利用了红黑树,所以其由 数组+链表+红黑 树 组成 。 根据 Java7 HashMap 的介绍,我们知道,查找的时候,根据 hash 值我们能够快速定位到数组的 具体下标,但是之后的话, 需要顺着链表一个个比较下去才能找到我们需要的,时间复杂度取决 于链表的长度,为 O(n) 。为了降低这部分的开销,在 Java8 中, 当链表中的元素超过了 8 个以后, 会将链表转换为红黑树 ,在这些位置进行查找的时候可以降低时间复杂度为 O(logN)。 3.4.2. ConcurrentHashMap Segment ConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它支持并发操作,所以要复杂一 些。整个 ConcurrentHashMap 由一个个 Segment 组成,Segment 代表”部分“或”一段“的 意思,所以很多地方都会将其描述为分段锁。注意,行文中,我很多地方用了“槽”来代表一个 segment。 线程安全( Segment 继承 ReentrantLock 加锁) 简单理解就是,ConcurrentHashMap 是一个 Segment 数组,Segment 通过继承 ReentrantLock 来进行加锁,所以每次需要加锁的操作锁住的是一个 segment,这样只要保证每 个 Segment 是线程安全的,也就实现了全局的线程安全。 并行度(默认 16 concurrencyLevel:并行级别、并发数、Segment 数,怎么翻译不重要,理解它。默认是 16, 也就是说 ConcurrentHashMap 有 16 个 Segments ,所以理论上,这个时候,最多可以同时支 持 16 个线程并发写,只要它们的操作分别分布在不同的 Segment 上。这个值可以在初始化的时 候设置为其他值,但是一旦初始化以后,它是不可以扩容的。再具体到每个 Segment 内部,其实 每个 Segment 很像之前介绍的 HashMap,不过它要保证线程安全,所以处理起来要麻烦些。 Java8 实现 (引入了红黑树) Java8 对 ConcurrentHashMap 进行了比较大的改动,Java8 也引入了红黑树。

更多推荐

java的HashMap知多少

本文发布于:2023-07-28 18:35:27,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1276191.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:知多少   java   HashMap

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!