二、小顶堆
- Timer和定时任务线程池用的都是基于小顶堆
- 后面的quartz以及更高级的是基于时间轮算法
2.1 堆
- 堆是一颗完全二叉树
- 完全二叉树:除了最后一层外,其他层都达到最大节点数,且最后一层节点都靠左排列。
- 小顶堆:最小值在上面
- 大顶堆:最大值在上面
- 要掌握:堆的,存,取
- 存的话,java有两种:数组和列表【这里选用的数组的方式】
- 堆插入数组的原则:从上到下,从左向右。
- 查询不方便,所以数组下标0的位置不放数字。
- 这样的好处是查询父节点方便,只需要用子节点的下标/2即可。
- 注:每一个节点存的是一个Job,Job的值就包含了触发时间(所以越靠前触发时间越近)。
2.2 插入元素[插入尾部,然后上浮]
- 记住一句话:插入尾部,然后上浮就可以了【上浮下沉还有个词叫:堆化】
- 插入尾部:就避免了插到头部数组的整体移动问题
- 然后上浮:和他的父节点比,如果小于父节点就替换。迭代向上走
2.3 删除堆顶元素[将尾部(最大的元素)元素放到堆顶,然后下沉]
- 删除只能取堆顶元素
- 记住这句话就行了:将尾部(最大的元素)元素放到堆顶,然后下沉【上浮下沉还有个词叫:堆化】
- 比如:将8放到根节点上之后(删除原来的)
- 然后和比较小的子节点进行交换
- 继续迭代上面的步骤
2.4 以上呢种就是核心下面是了解【建堆,堆排序,总结】