java 集合八股文
Collection接口
ArrayList 底层数组 增删慢 查询快
LinkedList 底层链表 增删快 查询慢
Map接口
put方法
HashMap 的 put 流程其实是一个先扰动、后寻址、最后解决冲突的过程。
首先,通过高 16 位异或进行 Hash 扰动,让分布更均匀。
接着,利用 (n-1) & hash 快速定位桶下标。
插入时,如果是新坑直接占领;如果是旧人(Key 相同)则覆盖;如果是碰撞,就看是树还是链表。链表用尾插法,超过 8 个且数组长度大于64就转红黑树。
最后,如果 size 超过了阈值,就进行 2 的幂次方扩容。扩容最天才的地方在于,它不需要重新计算所有 Hash,只需要判断 hash & oldCap 是否为 0,就能决定节点是留在原地还是平移 oldCap 个位置,极大地提高了数据迁移的效率。
转变规则
数组的cap<64 只扩容
链表节点数>8 且数组>=64 链表->红黑树
单筒内扩容拆分后红黑树节点<=6 红黑树转变为链表 删除不数个数 而是根据节点的状态根节点没了或左子树或右子树没了等等转变