资讯专栏INFORMATION COLUMN

Map简单记录

omgdog / 2537人阅读

摘要:笔记今天学习了中的和区别,简单记录下。因为每次操作都会设计链表的第一个元素,所以只给链表第一位元素加锁如果有哪些不对的地方烦请指认,先行感谢

Map 笔记

今天学习了 map 中的 hashMap 和 concurrentHashMap 区别,简单记录下。

1.JDk1.7

hashmap:

hashmap 是数组和链表的组合结构,线程不安全

hashmap 默认长度为 16,默认加载因子为 0.75,hashmap 添加数据时,添加后的长度大于等于原来长度*加载因子时会扩容,默认增加为原来的 2 倍

hashmap 指定长度和加载因子初始化构造方法时,hashmap 的长度初始化为大于等于指定长度的 2 的次方的值

hashmap 的长度总是为 2 的次方,主要是为了方便通过寻找到 entry 对象存在那个数组节点。

put() 方法操作时,先通过 hashcode 位运算和与运算后得到 hash,再通过 hash & (hashmap长度-1) 寻找到entry对象存在那个数组节点,然后得到这个节点存放的链表,如果为 null,直接存放,如果不为 null,则通过 key 判断是否有自己存放的 key 的 entry,有直接替换 value,返回 oldvalue,如果没有判断链表长度,最后放在链表头部,然后存放链表原来头部 entry 的下标 next,链表下移

扩容时,数组元素中链表的顺序和原来存放的顺序刚好相反,并且会出现死循环的问题

hashtable:线程安全,给 put() 方法加了个 synchronized,效率慢
concurrentHashMap: 构造方法中比 hashmap 多个级别level的参数,该 map 把一个entry数组分为了 level 个,segment,并且每个都加锁,每个 segment 的长度为 map 的长度/level

2.JDK1.8

hashmap:
相对于 jdk1.7 的区别:

put() 方法插入元素,追加在链表的尾部,而不是插入头部再向下移动一位

链表长度大于等于8时会树化为红黑树结构

concurrentHashMap:
相对于 jdk1.7 的区别:没有了 segment。因为每次操作都会设计链表的第一个元素,所以只给链表第一位元素加锁

如果有哪些不对的地方烦请指认,先行感谢

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75348.html

相关文章

  • Apache Spark 的一些浅见。

    摘要:二求文件中包含包租婆的行数从一个总计行的文件中找出所有包含包租婆的行数,我们不用太动脑筋就有一个算法读一行,判断这一行有包租婆吗如果有,全局变量加。在台机器上分别执行笨办法计算包含包租婆的行数。 一、搬砖 vs. 分布式计算 一个人搬砖很累,几个人一起搬就会轻松很多,也会快很多: showImg(https://segmentfault.com/img/bVp6EK); 分布并行计算和...

    jsyzchen 评论0 收藏0
  • 我是怎样用函数式JavaScript计算数组平均值的

    摘要:简单模式记录多个累加值在之前的版本中,我们创建了很多中间变量,。接下来,我们给自己设一个挑战,使用链式操作,将所有的函数调用组合起来,不再使用中间变量。你甚至可以继续简化上述代码,移除不必要的中间变量,让最终的计算代码只有一行。 译者按: 有时候一个算法的直观、简洁、高效是需要作出取舍的。 原文: FUNCTIONAL JAVASCRIPT: FIVE WAYS TO CALCULA...

    renweihub 评论0 收藏0
  • hashMap是什么

    摘要:经过上述讨论,我们发现,哈希查找的时间复杂度最小没有冲突是二是什么首先是中的一个接口。在中,有很多类实现了接口,就是其中的一个三是什么是一个实现了接口的基于哈希表的类。 我们要想知道HashMap是什么就先要了解Hash和Map是什么 一、Hash是什么 ① 哈希查找是一种数据结构中用于 查找 的算法,相比于其他查找算法,他的时间复杂度更 低,所以在实际应用中大量采取了哈希表的方...

    未东兴 评论0 收藏0

发表评论

0条评论

omgdog

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<