Map
羯殇
这个作者很懒,什么都没留下…
展开
-
HashMap的get/put
HashMap结构JDK1.7及之前:数组+链表JDK1.8:数组+链表+红黑树数组+链表当数据通过put()方法插入时会通过hash散列算法计算得出固定长度的数组下标——>int hash = hash(key);如果该数组下标对应的数据是null,则直接插入。如果有数值——>1.7:头插法,通过改变头部节点的上节点指向1.8:尾插法,通过改变尾部节点的下节点指向由于HashMap属于线程不安全结构,那么如果多线程插入时扩容产生元素迁移则会导致原来a->b的指向,原创 2022-01-30 14:46:39 · 1637 阅读 · 0 评论 -
Map扩容
扩容:HashMap负载因子0.75,默认容量16当HashMap底层数据结构链表长度超过8数组长度不超过64时,且元素超过16*0.75=12时,进行扩容,每次扩容容量为之前的2次幂。1.7:先扩容、后赋值,通过计算hash赋值到新的HashMap中1.8:直接使用旧hash或索引+旧容量大小...原创 2022-01-30 14:46:09 · 3362 阅读 · 0 评论 -
hashMap线程安全
线程安全问题:1、因为如果两个线程同时进行插入操作,当A线程在通过hash碰撞的判断之后,此时进入到B线程进行了插入操作,当B线程执行完毕后由于A线程已经进行过hash碰撞判断所以可能会导致A线程数据将B线程数据覆盖。2、当多线程同时检测到map数组需要进行扩容操作时,多条线程会同时进行数组扩容hash计算,但最终只会有一个线程会把扩容后的数组返回给map,但是由于多线程在计算过程中每个hash会更改,则会导致死循环需要线程安全的map则选用hashTableMap(get、put是同步的,同时只能有原创 2022-01-30 14:45:29 · 1327 阅读 · 0 评论