两万字长文读懂 Java 集合( 九 )


在文档中作者写到:ArrayDeque 作为栈时比 Stack 性能好,作为队列时比 LinkedList 性能好
由于双端队列只能在头部和尾部操作元素,所以删除元素和插入元素的时间复杂度大部分都稳定在 O(1),除非在扩容时会涉及到元素的批量复制操作 。但是在大多数情况下,使用它时应该指定一个大概的数组长度,避免频繁的扩容 。
个人观点:链表的插入、删除操作涉及到指针的操作,我个人认为作者是觉得数组下标的移动要比指针的操作要廉价,而且数组采用连续的内存地址空间,而链表元素的内存地址是不连续的,所以数组操作元素的效率在寻址上会比链表要快 。请批判看待观点 。
 
PriorityQueuePriorityQueue 基于优先级堆实现的优先级队列,而堆是采用数组实现:
两万字长文读懂 Java 集合

文章插图
文档中的描述告诉我们:该数组中的元素通过传入 Comparator 进行定制排序,如果不传入 Comparator 时,则按照元素本身自然排序,但要求元素实现了 Comparable 接口,所以 PriorityQueue 不允许存储 元素 。
PriorityQueue 应用场景:元素本身具有优先级,需要按照优先级处理元素
  • 例如游戏中的VIP玩家与普通玩家,VIP 等级越高的玩家越先安排进入服务器玩耍,减少玩家流失 。
 public static void main(String[] args) {Student vip1 = new Student("张三", 1);Student vip3 = new Student("洪七", 2);Student vip4 = new Student("老八", 4);Student vip2 = new Student("李四", 1);Student normal1 = new Student("王五", 0);Student normal2 = new Student("赵六", 0);// 根据玩家的 VIP 等级进行降序排序PriorityQueue<Student> queue = new PriorityQueue<>((o1, o2) -> o2.getScore.compareTo(o1.getScore));queue.add(vip1);queue.add(vip4);queue.add(vip3);queue.add(normal1);queue.add(normal2);queue.add(vip2);while (!queue.isEmpty) {Student s1 = queue.poll;System.out.println(s1.getName + "进入游戏; " + "VIP等级: " + s1.getScore);}}public static class Student implements Comparable<Student> {private String name;private Integer score;publicStudent(String name, Integer score) {this.name = name;this.score = score;}@Overridepublic int compareTo(Student o) {return this.score.compareTo(o.getScore);}}执行上面的代码可以得到下面这种有趣的结果,可以看到氪金使人带来快乐 。
两万字长文读懂 Java 集合

文章插图
VIP 等级越高(优先级越高)就越优先安排进入游戏(优先处理),类似这种有优先级的场景还有非常多,各位可以发挥自己的想象力 。
PriorityQueue 总结:
  • PriorityQueue 是基于优先级堆实现的优先级队列,而堆是用数组维护的
  • PriorityQueue 适用于元素按优先级处理的业务场景,例如用户在请求人工客服需要排队时,根据用户的VIP等级进行 插队 处理,等级越高,越先安排客服 。
章节结束各集合总结:(以 JDK1.8 为例)
两万字长文读懂 Java 集合

文章插图
两万字长文读懂 Java 集合

文章插图
文末总结
这一篇文章对各个集合都有些点到即止的味道,此文的目的是对整个集合框架有一个较为整体的了解,分析了最常用的集合的相关特性,以及某些特殊集合的应用场景例如 TreeSet 、 TreeMap 这种可定制排序的集合 。