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

文章插图
文档中的描述告诉我们:该数组中的元素通过传入 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);}}执行上面的代码可以得到下面这种有趣的结果,可以看到氪金使人带来快乐 。
文章插图
VIP 等级越高(优先级越高)就越优先安排进入游戏(优先处理),类似这种有优先级的场景还有非常多,各位可以发挥自己的想象力 。
PriorityQueue 总结:
- PriorityQueue 是基于优先级堆实现的优先级队列,而堆是用数组维护的
- PriorityQueue 适用于元素按优先级处理的业务场景,例如用户在请求人工客服需要排队时,根据用户的VIP等级进行 插队 处理,等级越高,越先安排客服 。

文章插图

文章插图
文末总结
这一篇文章对各个集合都有些点到即止的味道,此文的目的是对整个集合框架有一个较为整体的了解,分析了最常用的集合的相关特性,以及某些特殊集合的应用场景例如 TreeSet 、 TreeMap 这种可定制排序的集合 。
- Collection 接口提供了整个集合框架最通用的增删改查以及集合自身操作的抽象方法,让子类去实现
- Set 接口决定了它的子类都是无序、无重复元素的集合,其主要实现有HashSet、TreeSet、LinkedHashSet 。
- HashSet 底层采用 HashMap 实现,而 TreeSet 底层使用 TreeMap 实现,大部分 Set 集合的操作都会转换为 Map 的操作,TreeSet 可以将元素按照规则进行排序 。
- HashSet 底层采用 HashMap 实现,而 TreeSet 底层使用 TreeMap 实现,大部分 Set 集合的操作都会转换为 Map 的操作,TreeSet 可以将元素按照规则进行排序 。
- List 接口决定了它的子类都是有序、可存储重复元素的集合,常见的实现有 ArrayList,LinkedList,Vector
- ArrayList 使用数组实现,而 LinkedList 使用链表实现,所以它们两个的使用场景几乎是相反的,频繁查询的场景使用 ArrayList,而频繁插入删除的场景最好使用 LinkedList
- LinkedList 和 ArrayDeque 都可用于双端队列,而 Josh Bloch and Doug Lea 认为 ArrayDeque 具有比 LinkedList 更好的性能,ArrayDeque 使用数组实现双端队列,LinkedList 使用链表实现双端队列 。
推荐阅读
- 已有两种太空探测器飞出我们的太阳系 飞往太阳系外的探测器
- 生科医学|全国疫情形势呈逐渐企稳态势!上海两区首日达到社会面清零目标
- 两只耳朵配不一样的助听器,助听器需要两个耳朵都配吗??
- 前端开发和后端开发的区别?这两者哪个更累?
- 如何将两个pdf合并?合并pdf的快捷方法分享
- 验孕纸两条杠是怎么回事呢
- 喝白酒时,讲究这4个“最佳”,健康饮酒醉得慢,让你多喝二两半
- 减腰两边的赘肉怎么做?
- 水陆两栖动物名字大全 水陆两栖的动物是什么动物
- 花钱学Python?不存在的!一份大纲两个网站外加搜索,足矣
- ArrayList 使用数组实现,而 LinkedList 使用链表实现,所以它们两个的使用场景几乎是相反的,频繁查询的场景使用 ArrayList,而频繁插入删除的场景最好使用 LinkedList
