jdk優先順序佇列原始碼分析

2021-09-29 14:58:55 字數 1562 閱讀 8405

上文講述了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...