|-----------|----|------|--------------|--------|
| ArrayList | 10 | N/A | 元素数>当前容量 | 1.5倍增长 |
| HashMap | 16 | 0.75 | 元素数>容量×负载因子 | 2倍增长 |
hashset底层使用hashmap实现
hashmap
数组链表红黑树 + hash算法
用链表是来解决数组下标会覆盖的问题,冲突的问题。为什么hashmap用两个数据结构
头插法、尾插法
头插法(多线程出现死循环 cpu 100%)
:扩容时从头节点开始插
put和get都使用hash算法
红黑树的查询效率
当链表长度>=8且容量大小大于64的时候转红黑树
=<6红黑树转链表
ConcurrentHashMap(并发安全map)
cas乐观锁
锁粒度非常小只在链表头节点 、红黑树上加锁synchronized(log2n)
二分法查找的时间复杂度为 **O(logn)**
synchronized会发生上下文切换
链表
1、覆盖
2、直接插入next尾部(没有用头插法)