⑥. 高并发情况下扩容时的循环死链,Java8如何避免
- ①. HashMap本身就是线程不安全的,所以这种问题(循环死链)是在错误的使用方法上出现的更为严峻的问题
- ②. 在并发扩容的情况下,Jdk7是遍历每一个数组下标位置的链表,然后逐个元素采用头插法添加到新的空间。这样操作,在并发的情况下就会出现循环死链!
- ③. 图解循环死链:
④. Jdk8采用方法内部局部变量维护这个将被移动的数据(可能是一个新链表),然后在遍历结束后统一将新链表转移至对应新的下标位置,并非Jdk7那样一个一个元素进行转移。Jdk8链表添加元素采用尾插法
⑦. 什么是 hash,什么是hash表?
1.什么是hash? 它是将一个任2意长度的二进制值通过一个映射关系转换成一个固定长度的二进制值 (1).任意长度的二进制值 (2).映射关系[哈希算法--就相当于一个大学里面的学号的一个映射规则] (3).固定的二进制值 [哈希值--就相当于大学里面的学号] 任意长度的二进制值和固定长度的二进制的值 是一个一一对应的关系 固定长度的二进制值就相当于一个关键字key 真正有小的数据,就是这个学院的基本信息,一个任意长度的二进制值 value hash知识确定了一个key和一个value的唯一映射关系
2.hash表 (1).特点:最重要的特点---它的储存效率很高,取数据的时间复杂度是1 o(1) (2).hash表 是通过一个key一个输入,通过一个哈希函数,找到数组中与这个key唯一映射的value 通过这个hash函数,找到数组中这个value的下标,找到这个value[重要这句话] table aa=[]; int index=hash(key); int value=aa[index]; 注意:如果我们要找8,我们先写一个for循环,拿8和数组中的值进行比较。这样它的时间复杂度是n
3.hash函数 key,找下标,有哪些方法可以找到下标? 1.除留取余数法[就是%运算] int index=key % m; m的取值规则是什么呢? m要取比数组长度小的最大质数 m=15 如:int 1=1%15; 这个1就是下标 key=1,value=23 储存在index=1 key=17 value=22 储存在index=2 key=16 value=44 储存在index=1