国产精品吹潮在线播放,日韩一区二区三区在线播放,啊级免费黄片视频,66av视频

網站首頁
手機版

java雙端隊列作用(java 雙向隊列)

更新時間:2023-01-31 00:19:09作者:未知

java雙端隊列作用(java 雙向隊列)

LinkedBlockingDeque概述

LinkedBlockingDeque是由鏈表構成的界限可選的雙端阻塞隊列,支持O(1)的時間復雜度從兩端插入和移除元素,如不指定邊界,則為Integer.MAX_VALUE。

由一個ReentrantLock保證同步,使用conditions來實現等待通知。

linkLast

在last節(jié)點后加入節(jié)點node,更新last。如果插入之后超出容量,返回false。

private boolean linkLast(Node node) { // assert lock.isHeldByCurrentThread(); if (count >= capacity) return false; Node l = last; node.prev = l; last = node; if (first == null) first = node; else l.next = node; ++count; notEmpty.signal();// 滿足notEmpty條件 return true; }

unlinkFirst

移除first節(jié)點,并返回其item值,如果隊列為空,則返回full。

private E unlinkFirst() { // assert lock.isHeldByCurrentThread(); Node f = first; if (f == null) return null; Node n = f.next; E item = f.item; f.item = null; f.next = f; // help GC first = n; if (n == null) last = null; else n.prev = null; --count; notFull.signal();// 滿足notFull條件 return item; }

unlink

移除任意一個節(jié)點,注意這里并沒有操作x本身的連接,因為它可能仍被iterator使用著。

void unlink(Node x) { // assert lock.isHeldByCurrentThread(); Node p = x.prev; Node n = x.next; // 移除的是first if (p == null) { unlinkFirst(); // 移除的是last } else if (n == null) { unlinkLast(); } else { // 移除的是中間節(jié)點 p.next = n; n.prev = p; x.item = null; // Don't mess with x's links. They may still be in use by // an iterator. // 這里x的prev和next指針都沒有改變,因為他們可能在被iterator使用 --count; notFull.signal(); } }

總結

LinkedBlockingDeque是由鏈表構成的界限可選的雙端阻塞隊列,支持O(1)的時間復雜度從兩端插入和移除元素,如不指定邊界,則為Integer.MAX_VALUE。

由一個ReentrantLock保證同步,使用conditions來實現等待通知。

上面介紹的所有操作基本上就是核心方法啦,諸如putFirst、putLast、takeFirst、takeLast等方法都會調用上面的核心方法,而且實現上面也是比較簡單的,就是雙端鏈表的基本操作,不懂的可以畫畫圖幫助理解哈。

以上就是本站?java雙端隊列作用(java三種隊列詳解)的相關內容了,更多精彩請關注作者:萬年知識

聲明:本文由本站【創(chuàng)業(yè)者資源平臺】作者編輯發(fā)布,更多技術關注萬年技術!

本文標簽: [db:關鍵詞]