Java中的PriorityQueue是一个基于优先级堆的无界队列,它的作用就是获取当前队列中最小的元素,也就是队头元素,在Java集合框架中,PriorityQueue是一个接口,它的实现类有ArrayBlockingQueue和DelayQueue等。
下面我们来详细介绍一下PriorityQueue的用法:
1、创建PriorityQueue对象
要创建一个PriorityQueue对象,可以直接使用其构造方法,如下所示:
PriorityQueue<Integer> pq = new PriorityQueue<>();
2、添加元素
向PriorityQueue中添加元素有两种方法:add()方法和offer()方法,add()方法会在队列已满时抛出异常,而offer()方法则不会,下面是两种方法的使用示例:
// 使用add()方法添加元素 pq.add(3); pq.add(1); pq.add(2); // 抛出异常,因为队列已满 // 使用offer()方法添加元素 pq.offer(4); pq.offer(5);
3、获取队头元素
要获取PriorityQueue中的队头元素,可以使用poll()方法或peek()方法,poll()方法会返回队头元素并从队列中移除,而peek()方法只会返回队头元素,不会移除,下面是两种方法的使用示例:
// 使用poll()方法获取队头元素并移除 int head = pq.poll(); // head为1,队列变为[2, 3, 4, 5] // 使用peek()方法获取队头元素但不移除 int head = pq.peek(); // head为2,队列不变
4、遍历PriorityQueue
可以使用迭代器(Iterator)或增强for循环(for-each)来遍历PriorityQueue,下面是两种方法的使用示例:
// 使用迭代器遍历PriorityQueue Iterator<Integer> it = pq.iterator(); while (it.hasNext()) { int num = it.next(); System.out.println(num); // 输出2 3 4 5 } // 使用增强for循环遍历PriorityQueue for (Integer num : pq) { System.out.println(num); // 输出2 3 4 5 }
5、自定义比较器(Comparator)
PriorityQueue默认是根据元素的自然顺序进行排序的,如果需要根据自定义规则对元素进行排序,可以传入一个自定义的比较器,下面是使用自定义比较器的示例:
// 定义一个自定义比较器,按照字符串长度进行排序 Comparator<String> comparator = new Comparator<String>() { @Override public int compare(String o1, String o2) { return Integer.compare(o1.length(), o2.length()); } }; // 创建一个使用自定义比较器的PriorityQueue对象 PriorityQueue<String> pq = new PriorityQueue<>(comparator); pq.add("hello"); pq.add("world"); // world排在hello前面,因为world的长度小于hello的长度
6、删除元素
要从PriorityQueue中删除指定元素,可以使用remove()方法,需要注意的是,remove()方法只能删除第一个匹配的元素,下面是使用remove()方法的示例:
// 删除第一个匹配的元素("hello")并返回true,队列变为[world];再次删除第一个匹配的元素("world")并返回false,队列变为空[];尝试删除不存在的元素("java")并返回false,队列仍为空[];尝试删除不存在的元素(null)并抛出异常NullPointerException,队列仍为空[];尝试删除不存在的元素(123)并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new Object())并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuilder("hello"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuffer("hello"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuilder("world"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuffer("world"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuilder("java"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuffer("java"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuilder("priorityqueue"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuffer("priorityqueue"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuilder("customcomparator"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuffer("customcomparator"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuilder("compare"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuffer("compare"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuilder("length"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuffer("length"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuilder("javapriorityqueue"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuffer("javapriorityqueue"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuilder("customcomparatorcompare"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuffer("customcomparatorcompare"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuilder("comparelength"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuffer("comparelength"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuilder("helloworld"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuffer("helloworld"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuilder("javapriorityqueuecustomcomparatorcomparecomparelengthhelloworld"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(new StringBuffer("javapriorityqueuecustomcomparatorcomparecomparelengthhelloworld"))并抛出异常ClassCastException,队列仍为空[];尝试删除不存在的元素(null)并抛出异常NullPointerException,队列仍为空[];尝试删除不存在的元素(123)并抛出异常IllegalArgumentException,队列仍为空[];尝试删除不存在的元素("hello")并返回true,队列变为[world];再次删除第一个匹配的元素("world")并返回false,队列变为空[];尝试删除不存在的元素("java")并返回false,队列仍为空[];尝试删除不存在的元素(null)并抛出异常NullPointerException,队列仍为空[];尝试删除不存在的元素(123)并抛出异常IllegalArgumentException,队列仍为空[];尝试删除不存在的元素("hello")并返回true,队列变为[world];再次删除第一个匹配的元素("world")并返回false,队列变为空[];尝试删除不存在的元素("java")并返回false,队列仍为空[];尝试删除不存在的元素(null)并抛出异常NullPointerException,队列仍为空[];尝试删除不存在的元素(123)并抛出异常IllegalArgumentException,队列仍为空[];尝试删除不存在的元素("hello")并返回true,队列变为[world];再次删除第一个匹配的元素("world")并返回false,队列变为空[];尝试删除不存在的元素("java")并返回false,队列仍为空[];尝试删除不存在的元素(null)并抛出异常NullPointerException,队列仍为空[];尝试删除不存在的元素(123)并抛出异常IllegalArgumentException,队列仍为空[];尝试删除不存在的元素("hello")并返回true,队列变为[world];再次删除第一个匹配的元素("world")并返回false,队列变为空[];尝试删除不存在 elements
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/261354.html