日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

初學(xué)者java入門基礎(chǔ)知識 java雙端隊(duì)列原理

隊(duì)列(Queue):與棧相對的一種數(shù)據(jù)結(jié)構(gòu) ,  集合(Collection)的一個(gè)子類 。隊(duì)列允許在一端進(jìn)行插入操作 , 而在另一端進(jìn)行刪除操作的線性表 , 棧的特點(diǎn)是后進(jìn)先出 , 而隊(duì)列的特點(diǎn)是先進(jìn)先出 。隊(duì)列的用處很大 , 比如實(shí)現(xiàn)消息隊(duì)列 。Queue 類關(guān)系圖 , 如下圖所示:

初學(xué)者java入門基礎(chǔ)知識 java雙端隊(duì)列原理


注:為了讓讀者更直觀地理解 , 上圖為精簡版的 Queue 類關(guān)系圖 。本文如無特殊說明 , 內(nèi)容都是基于 Java 1.8 版本 。
隊(duì)列(Queue)1)Queue 分類從上圖可以看出 Queue 大體可分為以下三類 。
  1. 雙端隊(duì)列:雙端隊(duì)列(Deque)是 Queue 的子類也是 Queue 的補(bǔ)充類 , 頭部和尾部都支持元素插入和獲取 。
  2. 阻塞隊(duì)列:阻塞隊(duì)列指的是在元素操作時(shí)(添加或刪除) , 如果沒有成功 , 會(huì)阻塞等待執(zhí)行 。例如 , 當(dāng)添加元素時(shí) , 如果隊(duì)列元素已滿 , 隊(duì)列會(huì)阻塞等待直到有空位時(shí)再插入 。
  3. 非阻塞隊(duì)列:非阻塞隊(duì)列和阻塞隊(duì)列相反 , 會(huì)直接返回操作的結(jié)果 , 而非阻塞等待 。雙端隊(duì)列也屬于非阻塞隊(duì)列 。
2)Queue 方法說明Queue 常用方法 , 如下圖所示:

初學(xué)者java入門基礎(chǔ)知識 java雙端隊(duì)列原理


方法說明:
  • add(E):添加元素到隊(duì)列尾部 , 成功返回 true , 隊(duì)列超出時(shí)拋出異常;
  • offer(E):添加元素到隊(duì)列尾部 , 成功返回 true , 隊(duì)列超出時(shí)返回 false;
  • remove():刪除元素 , 成功返回 true , 失敗返回 false;
  • poll():獲取并移除此隊(duì)列的第一個(gè)元素 , 若隊(duì)列為空 , 則返回 null;
  • peek():獲取但不移除此隊(duì)列的第一個(gè)元素 , 若隊(duì)列為空 , 則返回 null;
  • element():獲取但不移除此隊(duì)列的第一個(gè)元素 , 若隊(duì)列為空 , 則拋異常 。
3)Queue 使用實(shí)例Queue<String> linkedList = new LinkedList<>();linkedList.add("Dog");linkedList.add("Camel");linkedList.add("Cat");while (!linkedList.isEmpty()) {System.out.println(linkedList.poll());}程序執(zhí)行結(jié)果:
Dog
Camel
Cat
阻塞隊(duì)列1)BlockingQueueBlockingQueue 在 java.util.concurrent 包下 , 其他阻塞類都實(shí)現(xiàn)自 BlockingQueue 接口 , BlockingQueue 提供了線程安全的隊(duì)列訪問方式 , 當(dāng)向隊(duì)列中插入數(shù)據(jù)時(shí) , 如果隊(duì)列已滿 , 線程則會(huì)阻塞等待隊(duì)列中元素被取出后再插入;當(dāng)從隊(duì)列中取數(shù)據(jù)時(shí) , 如果隊(duì)列為空 , 則線程會(huì)阻塞等待隊(duì)列中有新元素再獲取 。BlockingQueue 核心方法插入方法:
  • add(E):添加元素到隊(duì)列尾部 , 成功返回 true , 隊(duì)列超出時(shí)拋出異常;
  • offer(E):添加元素到隊(duì)列尾部 , 成功返回 true , 隊(duì)列超出時(shí)返回 false ;
  • put(E):將元素插入到隊(duì)列的尾部 , 如果該隊(duì)列已滿 , 則一直阻塞 。
刪除方法:
  • remove(Object):移除指定元素 , 成功返回 true , 失敗返回 false;
  • poll(): 獲取并移除隊(duì)列的第一個(gè)元素 , 如果隊(duì)列為空 , 則返回 null;
  • take():獲取并移除隊(duì)列第一個(gè)元素 , 如果沒有元素則一直阻塞 。
檢查方法: