国产日产欧产精品网站|2022仙踪林官网老狼信息|天天澡天天揉揉Av在线|国产精品成人久久久久久久

Java中的PriorityQueue

什么是Java中的PriorityQueue?

隊列遵循先進先出(First-In-First-Out)算法,而PriorityQueue的隊列元素則根據優先級進行處理(按自然順序或根據創建時提供的自定義比較器排序)。PriorityQueue基于優先級堆。我們無法創建不可比較對象的PriorityQueue。向PriorityQueue插入null將拋出NullPointerException,因為Java中的PriorityQueue不允許null元素。PriorityQueue是無界隊列。此隊列的頭是相對于指定排序的最小元素。如果多個元素的值相同,則頭是這些元素中的一個——平局將任意打破。隊列檢索操作poll、remove、peek和element訪問隊列頭部的元素。PriorityQueue從AbstractQueue、AbstractCollection、Collection和Object類繼承方法。在PriorityQueue中插入元素(offer())和刪除元素(poll())的時間復雜度均為O(log n),其中n是隊列中的元素數量。默認的PriorityQueue使用最小堆實現,這意味著堆中的頂部元素是最小的。如果我們想實現最大堆,則需要使用自定義比較器。在內部,Java中的PriorityQueue使用數組存儲元素。如果初始容量(在JDK 17中默認是11)不足以容納所有添加到隊列中的元素,則該數組會自動增大。雖然在創建PriorityQueue時不必指定初始容量,但如果您知道將要添加的元素數量,設置初始容量是有益的。這有助于防止隊列頻繁調整大小,從而避免浪費CPU資源。

您能提供一個PriorityQueue有用的示例場景嗎?

PriorityQueue可以用于操作系統中的任務調度等場景,在這些場景中,具有更高優先級的任務需要在較低優先級的任務之前執行。

PriorityQueue構造函數

  • PriorityQueue():創建一個具有默認初始容量(11)的PriorityQueue,該隊列根據自然順序對其元素進行排序。
  • PriorityQueue(Collection c):創建一個包含指定集合中元素的PriorityQueue。
  • PriorityQueue(int initialCapacity):創建一個具有指定初始容量的PriorityQueue,該隊列根據自然順序對其元素進行排序。
  • PriorityQueue(int initialCapacity, Comparator comparator):創建一個具有指定初始容量的PriorityQueue,該隊列根據指定比較器對其元素進行排序。
  • PriorityQueue(PriorityQueue c):創建一個包含另一個優先隊列中元素的PriorityQueue。
  • PriorityQueue(SortedSet c):創建一個包含指定排序集中的元素的PriorityQueue。

PriorityQueue操作

  • boolean add(E element):將指定元素插入此優先隊列。
  • boolean offer(E e):用于將特定元素插入優先隊列。
  • public peek():檢索但不移除此隊列的頭部,若隊列為空則返回null。
  • public poll():檢索并移除此隊列的頭部,若隊列為空則返回null。
  • public remove():從此隊列中移除指定元素的單個實例(如果存在)。當我們從優先隊列中移除元素時,首先移除的是按照指定順序的最小元素。
  • Iterator iterator():返回此隊列中元素的迭代器。
  • boolean contains(Object o):若此隊列包含指定元素則返回true。
  • void clear():用于移除優先隊列的所有內容。
  • int size():返回集合中存在的元素數量。
  • toArray():用于返回一個包含此隊列中所有元素的數組。
  • Comparator comparator():用于返回可以用于排序隊列元素的比較器。

offer和add方法的區別是什么?

offer()和add()是兩種將數據插入PriorityQueue的方法。在隊列中,add用于將指定元素插入隊列。成功時返回true,否則拋出異常。offer()也用于將指定元素插入隊列,但成功時返回true,否則返回false。在PriorityQueue的情況下,add方法的行為與offer()相同。如果查看實現,PriorityQueue的add方法內部調用了offer。

PriorityQueue示例

import java.util.Iterator;
import java.util.PriorityQueue;
public class PriorityQueueDemo {
public static void main(String[] args) {
		
		PriorityQueue<String> pQueue = new PriorityQueue<>();
		pQueue.add("Sebastian");
		pQueue.add("Boguslaw");
		pQueue.add("Kazimierz ");
		pQueue.add("Bozena");
		System.out.println("Size of pQueue:" + pQueue.size()); // 4
		Object[] arr = pQueue.toArray();
		System.out.println("Coverting pQueue into Array: ");
		for (int i = 0; i < arr.length; i++)
			System.out.print(arr[i].toString() + ", ");// Boguslaw, Bozena, Kazimierz , Sebastian,
		System.out.println();
		Iterator<String> pqItr = pQueue.iterator();
		while (pqItr.hasNext())
			System.out.print(pqItr.next() + ", ");// Boguslaw, Bozena, Kazimierz, Sebastian,
		System.out.println();
		pQueue.remove("Bozena");
		System.out.println("Printing pQueue after removing Bozena");
		pqItr = pQueue.iterator();
		while (pqItr.hasNext())
			System.out.print(pqItr.next() + ", ");// Boguslaw, Kazimierz , Sebastian,
		boolean isPresent = pQueue.contains("Bozena");
		System.out.println("pQueue contains Bozena or not? " + isPresent); // false
		
		isPresent = pQueue.contains("Sebastian");
		System.out.println("pQueue contains Sebastian or not? " + isPresent); // true
		System.out.println("Head of pQueue from peek:" + pQueue.peek());// Boguslaw
		System.out.println("Head of pQueue from poll:" + pQueue.poll());// Boguslaw
		pqItr = pQueue.iterator();
		while (pqItr.hasNext())
			System.out.print(pqItr.next() + ", ");// Kazimierz , Sebastian,
		System.out.println();
		pQueue.clear();
		System.out.println("Size of pQueue after calling clear:" + pQueue.size()); // 0
	}	
}

若你想提升Java技能,可關注我們的Java培訓課程。

霍邱县| 乌拉特中旗| 台中县| 浦城县| 东辽县| 克什克腾旗| 新乡市| 灵武市| 浏阳市| 大英县| 新和县| 肥城市| 闵行区| 措勤县| 沙河市| 乐安县| 宜州市| 福贡县| 柘荣县| 旌德县| 滨州市| 昭苏县| 乡宁县| 建湖县| 沭阳县| 马鞍山市| 喜德县| 南溪县| 千阳县| 盐津县| 麻栗坡县| 阳新县| 闵行区| 大城县| 九龙县| 揭西县| 连江县| 屏东市| 十堰市| 外汇| 石景山区|