一:优先级队列
优先级对列:按照元素之间的大小动态顺序出队,优先级队列处理的元素个数是动态变化的,有进有出,不像排序处理的集合个数是固定的.
JDK中的优先级队列默认是最小堆,所以需要我们去修改compareTo方法.
有时候在不同的场景下,对升序和降序都有要求,频繁根据不同场景修改已经写好的代码是大忌,所以我们使用Comparator比较器.
Comparator比较器:需要比较的类并不需要实现此接口,而是有一个专门的类实现此接口,这个类就是为了进行比较大小用的.使用Comparator来讲JDK的最小堆改造为最大堆使用
一般遇到从一堆数据中选出前**个数,应用堆来解决问题(取大用小,取小用大)
堆排序:
以最大堆为例,依次取出最大值直到堆为空,得到一个降序数组 => 无法在原数组上进行排序,还得创建一个和当前数组大小相同的堆 => 空间复杂度O(N)
1.任意数组都可以heapify => 调整为最大堆
i = arr.length;i>0;i++
2.再次遍历这个最大堆,swap(0,i) =>每当进行一次swap操作,就把当前堆的最大值交换到最终位置.
二:Map/Set
set :存储不重复的key值,使用set集合来进行去重处理
map:存储的是key==value键值对,若需要根据key找到对应的value使用map集合
在HaspMap中,元素的插入顺序和保存之后的顺序无关,若需要插入和保存顺序相同,使用LinkedHashMap
1.HashMap是基于哈希表 + 红黑树的结构(JDK8之后),HashMap的元素保存顺序与插入顺序无关,key和value都可以为null;