上文講述了netty優先順序佇列的實現方式,本文將jdk1.8原始碼實現的優先順序佇列,做進一步比較和分析.
從下圖繼承關係可知,netty實現與jdk實現優先順序佇列原理類似,只是netty針對task做了更多特定的封裝,而dk實現的priorityqueue通用性更強;
與netty實現類似,這裡也是以陣列實現堆結構來儲存優先順序佇列!同樣也存在比較器,方便使用者靈活定義比較功能;
jdk實現的入隊操作比netty實現更具有通用性,假如內建比較器為null,則會使用節點,強制轉換為comparable型別,使用該型別進行比較,其他具體操作除了部分細節不同外,基本上和netty的優先順序佇列實現差別不大!
//offer實現
public
boolean
offer
(e e)
//siftup實現
private
void
siftup
(int k, e x)
//從下往上堆化
@suppresswarnings
("unchecked"
)private
void
siftupusingcomparator
(int k, e x)
queue[k]
= x;
}
出隊操作原理與netty實現基本類似,也是先取堆頂元素,然後取最後乙個節點,自頂而下與子節點進行比較,進行堆化操作!
//poll實現
@suppresswarnings
("unchecked"
)public e poll()
//siftdown實現
private
void
siftdown
(int k, e x)
//從上往下堆化
@suppresswarnings
("unchecked"
)private
void
siftdownusingcomparator
(int k, e x)
queue[k]
= x;
}
jdk實現的優先順序佇列本質與netty實現基本一致,均是使用陣列構建小頂堆,插入則從下網上比較堆化,刪除則取最後乙個元素從上往下進行堆化處理!
總結一下,這裡有如下幾點值得學習的:
感受netty與jdk的優先順序佇列實現思路:基本思路一致,netty定製了scheculetask的一些特殊行為,而jdk則在通用性下了更多的功夫;
jdk實現中同樣存在擴容問題,這裡思路也與netty實現吻合;
為了保證容錯性,當比較器為空時候,jdk實現會使用比較器介面強制轉換佇列的儲存物件,這裡的選擇值得商榷,必須保證如果比較器未初始化,儲存節點必須繼承實現可比較介面!
佇列 優先順序佇列
優先順序佇列的隊尾是不需要改變的,永遠在低下標處。當佇列增加資料時,隊頭的位置就是資料項的大小減去1.public class priorityq 插入 public void insert long item else quearray j 1 item nitem 刪除 public long ...
優先順序佇列
分為最小優先順序佇列和最大優先順序佇列。優先順序佇列是一種用來維護一組元素構成的集合s的資料結構,這一組元素都有乙個關鍵字key,乙個最大優先順序佇列支援的操作 insert s,x 把x插入到集合s中 maxmum s 返回s中最大元素 extra max s 去掉s中最大關鍵字並返回該最大關鍵子...
優先順序佇列
1 include stdafx.h 2 include3 4 using namespace std 5 6 define max heap len 107 int heap max heap len 8 int heap size 0 the number of elements in heap...