2-HashMap
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
- HashMap原理
HashMap是一种key-value类型的数据结构在JDK8之后底层采用的是数据+链表+红黑树的结构
而数组是HashMap的主干其中数组的每个元素初始值都是NULL
HashMap中存储的数据的key值都是不允许重复的且存储数据是无序的。
数组中一个元素我们称之为一个bucket桶在HashMap添加数据时首先会根据所添加数据的key值计算其哈希值然后找到对应的数组下标将其添加至数组元素中
如果数组没有初始化就先进行初始化操作如果已经初始了就检查位置是否存在数据如果存在数据就说明发生了哈希碰撞这个时候就会判断两个数据的key值是否相等
如果相等则更新原来的值如果不相等则采用尾插法追加到同一哈希值元素的后面形成链表当碰撞产生多次之后使得链表长度大于8时链表就会转换成红黑树来存储。
·
·
·
- HashMap在多线程情况下是不安全的容易发生死循环jdk1.7
因为HashMap底层是用链表来存储数据当多个线程对其进行操作时触发了扩容机制那数据就会从旧的链表复制倒新的链表那这个操作旧容易把链表形成一个闭合的链表。
·
·
·
- CurrentHashMap在put添加数据的时候和HashMap的区别在于如果发生了哈希碰撞会引入一个乐观锁处理保证线程安全。其内部处理也是和HashMap一样。
·
·
·
- 多线程情况下就不要使用HashMap使用HashTableHashTable内部是用synchronized修饰加了锁之后只能被一个线程操作
其他线程就等待但是这种情况效率会十分低下因为其他线程不操作对象想获取数据的时候因为没有锁所以拿不到也只能等。
所以我们优先可以使用CurrentHashMap这个Map采用了分段锁的机制也就是将数据分成一段一段每一段都加一个锁
一段数据被一个线程锁住的时候其他的数据依然是可以访问的。
·
·
·
- CurrentHashMap缺陷
两个线程一个在插入大量数据一个在获取
那就有可能获取数据的线程获取到的不是最新的因为插入数据的线程还没有执行结束它就执行完了获取。
·
·
·
- LinkHashMap怎么实现有序
通过看它的底层源码就能知道内部有两个节点变量用来存储前置节点和后置节点通过这两个节点的指向实现有序。
·
·
·
- HashTable
内部使用了synchronized,锁住了整个数组
·
·
·
- CurrentHashMap
内部使用了分段锁
·
·
·
- 扩容机制
存储的数据量超过阈值就会扩容阈值计算是容量*加载因子0.75
扩容大小原来的两倍