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节点的下一个指向B,B节点的下一个指向A) 遍历造成死循环
使用尾插不会导致扩容链表顺序改变
红黑树;
规则
每个节点要么是红色要么是黑色
根节点是黑色,
所有叶子节点是黑色,
根节点到叶子节点不能有两个连续的红色,
任意节点到其叶子节点包含相同数目的黑色节点
如果增删改时破坏了规则 红黑树会通过变色和旋转来达到自平衡
java8以后HashMap结构为数组+链表,当链表长度大于8时 结构变为数组+红黑树
当缩减小于6时 重新变为数组+链表
HashMap ⽆法保证上⼀秒put的值,下⼀秒get的时候还是原值
HashTable单纯是在HashMap上加了synchronized 并发效率很低,
SynchronizedMap 初始化时会传入一个Map 和 一个Object(用来当锁)
然后Map执行的每个方法 都套了一层synchronized 来保证线程安全
ConcurrentHashMap
未完待续。。