Java集合HashMap,List底层

集合:

java.util包下的集合类 都是 fail-fast 快速失败的

如果多线程并发使用都是造成 并发修改异常

java.util.concurrent 包下都是 fail-safe 支持并发的

 

ArrayList 初始大小10  扩容每次1/2

ArrayList 默认初始化是0  第一次add()后变成10

ArrayList 指定初始化大小后 只是里面的数组制定了大小 size还是0,因此set()会报数组越界

ArrayList 插入某个元素,原理是 复制一份该元素index位置到末尾的一个数组,然后把新数组加到原来数组index+1之后的位置,index的位置再放入新元素

 

 删除某个index位置元素,原理是  复制index+1以后的一个数组,再从index位置覆盖原来数组

 

 

Collection.SynchronizedArrayLists 就是在ArrayList基础上套一个synchronized

 

ArrayList不适合做队列  总是复制迁移 耗费性能

数组适合做队列  ArrayBlockingQueue原理就是定长数组

 

ArrayList因为内存连续 因此遍历很快

 

 

HashMap<K,V>

数组加链表  

put(k,v)相当于 新增一个Node<k,v>节点

然后对K进行HASH取模算出HASH值 存入对应index的数组

相同HASH值的 就形成了一个链表

初始大小16

负载因子  0.75   当达到负载因子时  除法扩容

 

给初始化值是 尽量保证2的幂  以

扩容:创建⼀个新的Entry空数组,⻓度是原数组的2倍。

ReHash:遍历原Entry数组,把所有的Entry重新Hash到新数组。

 

java8之前是链表是头插法,

缺点: 新加入的节点都插在链表头部  多线程操作 扩容时会改变链表上的顺序 容易导致循环链表(A节点的下一个指向BB节点的下一个指向A) 遍历造成死循环

使用尾插不会导致扩容链表顺序改变

 

红黑树;

规则

每个节点要么是红色要么是黑色

根节点是黑色,

所有叶子节点是黑色,

根节点到叶子节点不能有两个连续的红色,

任意节点到其叶子节点包含相同数目的黑色节点

 

如果增删改时破坏了规则  红黑树会通过变色和旋转来达到自平衡

 

java8以后HashMap结构为数组+链表,当链表长度大于8时 结构变为数组+红黑树

当缩减小于6时  重新变为数组+链表

 

HashMap ⽆法保证上⼀秒put的值,下⼀秒get的时候还是原值

HashTable单纯是在HashMap上加了synchronized 并发效率很低,

 

SynchronizedMap 初始化时会传入一个Map 和 一个Object(用来当锁)

然后Map执行的每个方法  都套了一层synchronized 来保证线程安全

 

 

ConcurrentHashMap

未完待续。。

posted @ 2020-09-13 14:56  六小扛把子  阅读(511)  评论(1编辑  收藏  举报