时不时,我们需要以特定的顺序处理一个队列的项目。优先队列是执行任务的数据结构。Java优先队列不同于正常
(/community/tutorials/java-queue)。
优先选择Java
The java.util.PriorityQueue
class, provides us an implementation of such a data type, by using priority heap implementation internally. Java PriorityQueue is an unbounded queue. It was introduced in Java 1.5 and enhanced in Java SE 8 release. PriorityQueue is internally implemented by following Priority Heap
data structure. Here is the PriorityQueue class hierarchy: PriorityQueue Class Diagram:
Java PriorityQueue 建设者
- PriorityQueue() - 创建具有默认初始容量的PriorityQueue,即 11
- PriorityQueue(Collection c) - 创建具有指定的集合元素的PriorityQueue
- PriorityQueue(int initialCapacity) - 创建具有指定的初始容量的PriorityQueue
- PriorityQueue(int initialCapacity, Comparator comparator) - 创建具有指定的初始容量的PriorityQueue和其元素的排序是根据指定的比较器( )5. PriorityQueue(PriorityQuee c)
优先排序元素按其自然排序排序,除非我们在创建时提供一个 Comparator
元素。
Java 优先例子
让我们创建一个PriorityQueue
,包含各种任务:
1PriorityQueue tasks=new PriorityQueue();
2tasks.add("task1");
3tasks.add("task4");
4tasks.add("task3");
5tasks.add("task2");
6tasks.add("task5");
这将创建一个任务的PriorityQueue,该任务将由自然排序的‘字符串’进行排序。让我们创建另一个任务排序的PriorityQueue,以自然排序的逆顺序进行排序。
1PriorityQueue reverseTasks=new PriorityQueue(Comparator.reverseOrder());
2reverseTasks.add("task1");
3reverseTasks.add("task4");
4reverseTasks.add("task3");
5reverseTasks.add("task2");
6reverseTasks.add("task5");
Java 优先化方法
现在,让我们看看 PriorityQueue 可用的所有方法,并使用它们:
- 联合国 ** 博勒语加(E)** - 这种方法在队列中插入指定的元素。 我们已经使用这种方法在队列中添加了5个任务.
- ** 比较者()** - 此方法返回用于命令此队列中的元素的比较器 。 如果没有指定参照者,则返回为无效,而且队列按照元素的自然顺序排序。 因此,如果我们这样做:(_ )_ system.out.println(任务.comparator ()); system.out.println(逆向任务.comparator ()); ______ 输出会为:______ 无效 java.util. Collections$ Reverseconverator@15db9742
- ** boolean 包含(object)** - 如果队列包含指定的元素,则返回为真。 让我们检查
任务3
是否属于优先队列任务 :( _) __ system.out.println( tasks.comins ("task3")); _ ______ 此打印 :\ 真 \ - ** boolean offer(E) ** - 与添加()方法一样,这种方法也为队列添加了元素. 对容量受限的队列,要约()和加()方法实际上有些不同,但对于优先排队,两者是相同的. 与添加()不同的是,要约()即使未在队列中添加元素也不会丢出例外.
- ** E 偷看 () ** - 获取此队列的头部, 或者如果此队列为空则返回为无效 。 换言之,它以最优先的方式返回元素。 因此,以下代码:
QQ
system.out.println(任务.peek ()); (-
) system.out.println(任务.peek ()); (-
) QQ 给我们: (--
)任务1 (-
)任务5 (-
) (-
). ** E调查()** - 这种方法还检索到队列头部(具有最高优先级的元素),或者如果队列为空则返回为无效. 但与偷看( S) 不同, 它也会删除元素 。 因此,如果我们调用民意调查(:
system.out.println(关于任务的邮箱:
+tasks.poll ()); System.out.println(关于反向任务的邮箱:
+逆向Tasks.poll ()); ) QQ再偷看:QQ System.out.println ("Peek on josks:"+tasks.peek (") System.out.println ("Peek on 逆向任务:"+逆向任务.peek (")"); QQ 任务:任务1(__) ) 反向任务的投放:任务5 任务上皮克:任务2 逆向任务上皮克:任务4 QQ - **int six () ** - 返回队列中的元素数.
- ** boolean 删除(object) ** - 如果队列存在,则从队列中删除指定的元素。 如果存在两个相同的元素,则只去除其中之一.
- ** Object[] to Array () ** - 返回包含队列中所有元素的数组. () )10. T[] toArray(T[]a) - 返回包含队列中所有元素的数组,返回的数组类型是指定的数组类型. () )11 (英语). ** Iterator 迭代 () ** - 返回队列的迭代 .
- **void clear () ** - 删除队列中的所有元素 。 (_) (英语)
除了这些,PriorityQueue还继承了从收藏
和对象
类的方法。
Java 优先时间复杂性
- 对于 enqueing 和 dequeing 方法,时间复杂性为 O(log(n))
- 对于 remove(Object) 和 contains(Object) 方法,时间复杂性为线性
- 对于检索方法,它具有恒定的时间复杂性
因此,如果我们需要同步访问,我们需要使用 PriorityBlockingQueue。