導航:首頁 > 編程語言 > priorityqueuejava

priorityqueuejava

發布時間:2024-08-19 06:50:06

java priorityqueue 哪些方法

1.下表顯示了jdk1.5中的阻塞隊列的操作:
add 增加一個元索 如果隊列已滿,則拋出一個IIIegaISlabEepeplian異常
remove 移除並返回隊列頭部的元素 如果隊列為空,則拋出一個NoSuchElementException異常
element 返回隊列頭部的元素 如果隊列為空,則拋出一個NoSuchElementException異常
offer 添加一個元素並返回true 如果隊列已滿,則返回false
poll 移除並返問隊列頭部的元素 如果隊列為空,則返回null
peek 返回隊列頭部的元素 如果隊列為空,則返回null
put 添加一個元素 如果隊列滿,則阻塞
take 移除並返回隊列頭部的元素 如果隊列為空,則阻塞
remove、element、offer 、poll、peek 其實是屬於Queue介面。
2.阻塞隊列的操作可以根據它們的響應方式分為以下三類:aad、removee和element操作在你試圖為一個已滿的隊列增加元素或從空隊列取得元素時 拋出異常。當然,在多線程程序中,隊列在任何時間都可能變成滿的或空的,所以你可能想使用offer、poll、peek方法。這些方法在無法完成任務時 只是給出一個出錯示而不會拋出異常。

注意:poll和peek方法出錯進返回null。因此,向隊列中插入null值是不合法的。
3.還有帶超時的offer和poll方法變種,例如,下面的調用:
boolean success = q.offer(x,100,TimeUnit.MILLISECONDS);
嘗試在100毫秒內向隊列尾部插入一個元素。如果成功,立即返回true;否則,當到達超時進,返回false。同樣地,調用:
Object head = q.poll(100, TimeUnit.MILLISECONDS);
如果在100毫秒內成功地移除了隊列頭元素,則立即返回頭元素;否則在到達超時時,返回null。
4.最後,我們有阻塞操作put和take。put方法在隊列滿時阻塞,take方法在隊列空時阻塞。
java.ulil.concurrent包提供了阻塞隊列的4個變種。默認情況下,LinkedBlockingQueue的容量是沒有上限的(說的不準確,在不指定時容量為Integer.MAX_VALUE,不要然的話在put時怎麼會受阻呢),但是也可以選擇指定其最大容量,它是基於鏈表的隊列,此隊列按 FIFO(先進先出)排序元素。

ArrayBlockingQueue在構造時需要指定容量, 並可以選擇是否需要公平性,如果公平參數被設置true,等待時間最長的線程會優先得到處理(其實就是通過將ReentrantLock設置為true來 達到這種公平性的:即等待時間最長的線程會先操作)。通常,公平性會使你在性能上付出代價,只有在的確非常需要的時候再使用它。它是基於數組的阻塞循環隊 列,此隊列按 FIFO(先進先出)原則對元素進行排序。

PriorityBlockingQueue是一個帶優先順序的 隊列,而不是先進先出隊列。元素按優先順序順序被移除,該隊列也沒有上限(看了一下源碼,PriorityBlockingQueue是對 PriorityQueue的再次包裝,是基於堆數據結構的,而PriorityQueue是沒有容量限制的,與ArrayList一樣,所以在優先阻塞 隊列上put時是不會受阻的。雖然此隊列邏輯上是無界的,但是由於資源被耗盡,所以試圖執行添加操作可能會導致 OutOfMemoryError),但是如果隊列為空,那麼取元素的操作take就會阻塞,所以它的檢索操作take是受阻的。另外,往入該隊列中的元 素要具有比較能力。

❷ java priorityqueue

java priorityqueue是怎樣的呢?下面就讓我們一起來了解一下吧:
java中的priorityqueue一般也就是代表優先隊列。
這是屬於Queue介面的實現,能夠對其中元素進行排序,還能放基本數據類型的包裝類或是自定義的類,而對於基本數據類型的包裝類,優先隊列中元素一般是默認排列順序為升序排列的。
參考範例:
隊列保存的是基本數據類型的包裝類,具體代碼為:
//自定義比較器,降序排列
static ComparatorInteger cmp = new ComparatorInteger() {
public int compare(Integer e1, Integer e2) {
return e2 - e1;
}
};
public static void main(String[] args) {
//不用比較器,默認升序排列
QueueInteger q = new PriorityQueue();
q.add(3);
q.add(2);
q.add(4);
while(!q.isEmpty())
{
System.out.print(q.poll()+ );
}
/**
* 輸出結果
* 2 3 4
*/
//使用自定義比較器,降序排列
QueueInteger qq = new PriorityQueue(cmp);
qq.add(3);
qq.add(2);
qq.add(4);
while(!qq.isEmpty())
{
System.out.print(qq.poll()+ );
}
/**
* 輸出結果
* 4 3 2
*/
}
隊列保存的是自定義類,具體代碼為:
//矩形類
class Node{
public Node(int chang,int kuan)
{
this.chang=chang;
this.kuan=kuan;
}
int chang;
int kuan;
}
public class Test {
//自定義比較類,先比較長,長升序排列,若長相等再比較寬,寬降序
static ComparatorNode cNode=new ComparatorNode() {
public int compare(Node o1, Node o2) {
if(o1.chang!=o2.chang)
return o1.chang-o2.chang;
else
return o2.kuan-o1.kuan;
}
};
public static void main(String[] args) {
QueueNode q=new PriorityQueue(cNode);
Node n1=new Node(1, 2);
Node n2=new Node(2, 5);
Node n3=new Node(2, 3);
Node n4=new Node(1, 2);
q.add(n1);
q.add(n2);
q.add(n3);
Node n;
while(!q.isEmpty())
{
n=q.poll();
System.out.println(長: +n.chang+ 寬: +n.kuan);
}
/**
* 輸出結果
* 長: 1 寬:2
* 長: 2 寬:5
* 長: 2 寬:3
*/
}
}

閱讀全文

與priorityqueuejava相關的資料

熱點內容
雲計算伺服器貴州雲空間 瀏覽:32
登錄伺服器login輸入什麼 瀏覽:876
三點指標公式源碼 瀏覽:544
黑馬程序員fetch教程 瀏覽:442
不用編程的游戲引擎 瀏覽:531
點菜pdf 瀏覽:82
聖經pdf下載 瀏覽:291
如何列印到pdf文件 瀏覽:557
石碣CNC編程 瀏覽:553
程序員那麼可愛31集上中下完整版 瀏覽:819
有什麼動漫app是可以免費看的 瀏覽:141
程序員語言有多少種 瀏覽:198
linux系統對硬碟分區 瀏覽:267
php7性能優化總結 瀏覽:820
pdf文本格式轉換器 瀏覽:116
androidmap排序 瀏覽:450
php類型自動 瀏覽:213
一鍵apk反編譯提取視頻文件 瀏覽:981
linuxshell釋放緩存命令 瀏覽:72
路由器伺服器主機名怎麼設置 瀏覽:992