敖丙思维导图系列目录
这些知识整理都是自己查阅帅丙资料(当然还有其他渠道)加以总结滴~ 每周都会更新知识进去。
如有不全或错误还请大家在评论中指出~
- 敖丙思维导图-集合
- 敖丙思维导图-多线程之synchronized\ThreadLocal\Lock\Volatitle\线程池
- 敖丙思维导图-JVM知识整理
- 敖丙思维导图-Spring
- 敖丙思维导图-Redis
- 敖丙思维导图-RocketMQ+Zookeeper
- 敖丙思维导图-Mysql数据库
今天开始准备系统的复习下Java集合体系啦,以敖 丙的复习脑图走啦~(ง •_•)ง
HashMap
数组里面每个地方都存了Key-Value这样的实例,在Java7叫Entry在Java8中叫Node
。
1.8插入数据时判断链表长度是否大于 8并且数组长度大于64, 大于的话链表转换为红黑树;当删除小于六时重新变为链表
根据泊松分布,在负载因子默认为0.75的时候,单个hash槽内元素个数为8的概率小于百万分之一,所以将7作为一个分水岭,等于7的时候不转换,大于等于8的时候才进行转换,小于等于6的时候就化为链表。
负载因子0.75
提高空间利用率 和 减少查询成本的折中,主要是泊松分布,0.75的话碰撞最小,
加载因子过高,例如为1,虽然减少了空间开销,提高了空间利用率,但同时也增加了查询时间成本
;
加载因子过低,例如0.5,虽然可以减少查询时间成本,但是空间利用率很低,同时提高了rehash操作的次数
。
在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少rehash操作次数,所以,一般在使用HashMap时建议根据预估值设置初始容量,减少扩容操作。
选择0.75作为默认的加载因子,完全是时间和空间成本上寻求的一种折衷选择,.
初始化长度16
默认初始化长度(1<<4就是16),因为位与运算比算数计算的效率高了很多。
15的的二进制是1111 。
因为Length-1的值是所有二进制位全为1,index的结果等同于HashCode后几位的值。只要输入的HashCode本身分布均匀,Hash算法的结果就是均匀的。2的幂实现均匀分布。
红黑树
红黑树是一种自平衡的二叉查找树
- 节点是红色或黑色。
- 根节点是黑色。
- 每个叶子节点都是黑色的空节点(NIL节点)。
- 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
这些规则确保 从根到叶子节点的最长路径不超过最短路径的2倍。
平衡时使用:变色 + 旋转
左旋转: 逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子。
为什么要有红黑树
二叉搜索树的查询、插入和删除一个节点的时间复杂度均为O(log(n))。但向其依次插入有序数组后会退化成链表。因此引入平衡二叉树。
平衡二叉树具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
平衡二叉树保证了在最差的情况下,二叉树依然能够保持绝对的平衡,即左右两个子树的高度差的绝对值不超过1。但是这又会带来一个问题,那就是