找回密码
 立即注册
首页 业界区 业界 12.Java SDK源码分析系列笔记-PriorityQueue

12.Java SDK源码分析系列笔记-PriorityQueue

龙玮奇 7 天前
目录

  • 1. PriorityQueue是什么
  • 2. 使用
  • 3. 源码分析

    • 3.1. 属性
    • 3.2. 有参构造

      • 3.2.1. 初始化元素到数组中
      • 3.2.2. 维护堆的属性

        • 3.2.2.1. 下沉操作


    • 3.3. 插入

      • 3.3.1. 上浮操作

    • 3.4. 删除

      • 3.4.1. 下沉操作


  • 4. 参考

1. PriorityQueue是什么

是一个队列,只不过加上了优先级的概念,换句话说队列里的元素是根据某种规则排好序的
2. 使用
  1. public class PriorityQueueTest
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.         List<Integer> list = Arrays.asList(20, 19, 18, 17, 16, 15, 14, 13, 12, 11);
  6.         PriorityQueue<Integer> queue = new PriorityQueue<>(list);
  7.         System.out.println("最开始的元素:" + queue);
  8.         System.out.println("============");
  9.         queue.offer(11);
  10.         System.out.println("添加了一个11:" + queue);
  11.         System.out.println("============");
  12.         List<Integer> sort = new ArrayList<>();
  13.         while (!queue.isEmpty())
  14.         {
  15.             Integer poll = queue.poll();
  16.             System.out.println("堆顶是:" + poll);
  17.             sort.add(poll);
  18.             System.out.println("剩余的元素:" + queue);
  19.             System.out.println("----------");
  20.         }
  21.         System.out.println("============");
  22.         System.out.println("堆排序的结果:" + sort);
  23.     }
  24. }
复制代码

  • 输出
  1. 最开始的元素:[11, 12, 14, 13, 16, 15, 18, 20, 17, 19]
  2. ============
  3. 添加了一个11:[11, 11, 14, 13, 12, 15, 18, 20, 17, 19, 16]
  4. ============
  5. 堆顶是:11
  6. 剩余的元素:[11, 12, 14, 13, 16, 15, 18, 20, 17, 19]
  7. ----------
  8. 堆顶是:11
  9. 剩余的元素:[12, 13, 14, 17, 16, 15, 18, 20, 19]
  10. ----------
  11. 堆顶是:12
  12. 剩余的元素:[13, 16, 14, 17, 19, 15, 18, 20]
  13. ----------
  14. 堆顶是:13
  15. 剩余的元素:[14, 16, 15, 17, 19, 20, 18]
  16. ----------
  17. 堆顶是:14
  18. 剩余的元素:[15, 16, 18, 17, 19, 20]
  19. ----------
  20. 堆顶是:15
  21. 剩余的元素:[16, 17, 18, 20, 19]
  22. ----------
  23. 堆顶是:16
  24. 剩余的元素:[17, 19, 18, 20]
  25. ----------
  26. 堆顶是:17
  27. 剩余的元素:[18, 19, 20]
  28. ----------
  29. 堆顶是:18
  30. 剩余的元素:[19, 20]
  31. ----------
  32. 堆顶是:19
  33. 剩余的元素:[20]
  34. ----------
  35. 堆顶是:20
  36. 剩余的元素:[]
  37. ----------
  38. ============
  39. 堆排序的结果:[11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
  40. Process finished with exit code 0
复制代码
3. 源码分析

3.1. 属性

[code]public class PriorityQueue extends AbstractQueue    implements java.io.Serializable {    private static final long serialVersionUID = -7720805057305804111L;    //默认的大小为11    private static final int DEFAULT_INITIAL_CAPACITY = 11;    //二叉堆:物理上是个数组,逻辑上看成二叉树    transient Object[] queue; // non-private to simplify nested class access    //容量    private int size = 0;    //比较器,用来确定插入的元素在二叉堆中的位置    private final Comparator
您需要登录后才可以回帖 登录 | 立即注册