java中PriorityBlockingQueue的入隊(duì)知識(shí)點(diǎn)總結(jié)
在PriorityBlockingQueue中添加元素同樣有四種方法,因?yàn)槭菢?shù)狀的結(jié)構(gòu),所以在插入方法上也有所變化,是自下而上的操作過(guò)程。在入隊(duì)的規(guī)則上有三個(gè)要點(diǎn)需要我們注意。鑒于PriorityBlockingQueue入隊(duì)方法主要通過(guò)offer(E)實(shí)現(xiàn),所以我們就這種方法作主要講解。
1.入隊(duì)規(guī)則
(1)默認(rèn)的插入規(guī)則中,新加入的元素可能會(huì)破壞小頂堆的性質(zhì),因此需要進(jìn)行調(diào)整。
(2)調(diào)整的過(guò)程為:從尾部下標(biāo)的位置開(kāi)始,將加入的元素逐層與當(dāng)前點(diǎn)的父節(jié)點(diǎn)的內(nèi)容進(jìn)行比較并交換,直到滿足父節(jié)點(diǎn)內(nèi)容都小于子節(jié)點(diǎn)的內(nèi)容為止。
(3)默認(rèn)的刪除調(diào)整中,首先獲取頂部下標(biāo)和最尾部的元素內(nèi)容,從頂部的位置開(kāi)始,將尾部元素的內(nèi)容逐層向下與當(dāng)前點(diǎn)的左右子節(jié)點(diǎn)中較小的那個(gè)交換,直到判斷元素內(nèi)容小于或等于左右子節(jié)點(diǎn)中的任何一個(gè)為止。
2.入隊(duì)方法
入隊(duì)方法有:add(E), put(E), offer(E, timeout, TimeUnit), offer(E)
public void put(E e) {
offer(e); // never need to block
}
public boolean offer(E e) {
//判斷是否為空
if (e == null)
throw new NullPointerException();
//顯示鎖
final ReentrantLock lock = this.lock;
lock.lock();
//定義臨時(shí)對(duì)象
int n, cap;
Object[] array;
//判斷數(shù)組是否滿了
while ((n = size) >= (cap = (array = queue).length))
//數(shù)組擴(kuò)容
tryGrow(array, cap);
try {
//拿到比較器
Comparator<? super E> cmp = comparator;
//判斷是否有自定義比較器
if (cmp == null)
//堆上浮
siftUpComparable(n, e, array);
else
//使用自定義比較器進(jìn)行堆上浮
siftUpUsingComparator(n, e, array, cmp);
//隊(duì)列長(zhǎng)度 +1
size = n + 1;
//喚醒休眠的出隊(duì)線程
notEmpty.signal();
} finally {
//釋放鎖
lock.unlock();
}
return true;
}
可以看出前三個(gè)方法內(nèi)部都是通過(guò) offer(e) 方法實(shí)現(xiàn)的。
相關(guān)文章
使用JVMTI實(shí)現(xiàn)SpringBoot的jar加密,防止反編譯
這篇文章主要介紹了使用JVMTI實(shí)現(xiàn)SpringBoot的jar加密,防止反編譯問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
SpringBoot使用Nacos進(jìn)行application.yml配置管理
Nacos是阿里巴巴開(kāi)源的一個(gè)微服務(wù)配置管理和服務(wù)發(fā)現(xiàn)的解決方案,它提供了動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和?服務(wù)管理平臺(tái),Nacos使用Raft協(xié)議保證配置的一致性,同時(shí)支持多種配置?格式,如properties、yaml等,本文介紹了SpringBoot使用Nacos進(jìn)行application.yml配置管理2024-12-12
ArrayList在for循環(huán)中使用remove方法移除元素方法介紹
這篇文章主要介紹了ArrayList在for循環(huán)中使用remove方法移除元素的內(nèi)容,介紹了具體代碼實(shí)現(xiàn),需要的朋友可以參考下。2017-09-09
Ubuntu下配置Tomcat服務(wù)器以及設(shè)置自動(dòng)啟動(dòng)的方法
這篇文章主要介紹了Ubuntu下配置Tomcat服務(wù)器以及設(shè)置自動(dòng)啟動(dòng)的方法,適用于Java的web程序開(kāi)發(fā),需要的朋友可以參考下2015-10-10
解決spring boot啟動(dòng)掃描不到自定義注解的問(wèn)題
這篇文章主要介紹了解決spring boot啟動(dòng)掃描不到自定義注解的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09

