欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java PriorityQueue數(shù)據(jù)結(jié)構(gòu)接口原理及用法

 更新時(shí)間:2020年10月21日 09:50:31   作者:cuisuqiang  
這篇文章主要介紹了Java PriorityQueue數(shù)據(jù)結(jié)構(gòu)接口原理及用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

PriorityQueue是從JDK1.5開始提供的新的數(shù)據(jù)結(jié)構(gòu)接口,它是一種基于優(yōu)先級(jí)堆的極大優(yōu)先級(jí)隊(duì)列。優(yōu)先級(jí)隊(duì)列是不同于先進(jìn)先出隊(duì)列的另一種隊(duì)列。每次從隊(duì)列中取出的是具有最高優(yōu)先權(quán)的元素。如果不提供Comparator的話,優(yōu)先隊(duì)列中元素默認(rèn)按自然順序排列,也就是數(shù)字默認(rèn)是小的在隊(duì)列頭,字符串則按字典序排列(參閱 Comparable),也可以根據(jù) Comparator 來指定,這取決于使用哪種構(gòu)造方法。優(yōu)先級(jí)隊(duì)列不允許 null 元素。依靠自然排序的優(yōu)先級(jí)隊(duì)列還不允許插入不可比較的對(duì)象(這樣做可能導(dǎo)致 ClassCastException)

優(yōu)先級(jí)隊(duì)列是無界的,但是有一個(gè)內(nèi)部容量,控制著用于存儲(chǔ)隊(duì)列元素的數(shù)組大小。它通常至少等于隊(duì)列的大小。隨著不斷向優(yōu)先級(jí)隊(duì)列添加元素,其容量會(huì)自動(dòng)增加。無需指定容量增加策略的細(xì)節(jié)

簡(jiǎn)單應(yīng)用:

package test;
import java.util.PriorityQueue;
public class PriorityQueueTest1 {
 @SuppressWarnings("unchecked")
 public static void main(String[] args) {
 PriorityQueue queue = new PriorityQueue();
 queue.add("AAAAA"); // Add接受的參數(shù)是Obj,PriorityQueue使用integer String等基本的數(shù)據(jù)類型時(shí),默認(rèn)new時(shí)有參數(shù),如果不寫則是按照默認(rèn)排序
 queue.add("BBBBB"); 
 queue.add("CCCCC"); 
 queue.add("DDDDD"); 
 
 System.out.println(queue.peek()); // 獲取但不移除此隊(duì)列的頭
 System.out.println(queue.poll()); // 獲取并移除此隊(duì)列的頭
 System.out.println(queue.poll());
 
 queue.offer("ZZZZZ"); // 將指定的元素插入此優(yōu)先級(jí)隊(duì)列
 
 System.out.println(queue.poll());
 System.out.println(queue.poll());
 System.out.println(queue.poll());
 
 System.out.println(queue.poll()); // 到這里已經(jīng)沒有元素,打印Null
 }
}

定義比較器:

package test;
import java.util.Comparator;
import java.util.PriorityQueue;
@SuppressWarnings("unchecked")
public class PriorityQueueTest2 {
 private static PriorityQueue queue = new PriorityQueue(10,new Comparators());
 public static void main(String[] args) {
 QueueObject queueObject = new QueueObject();
 queueObject.setId(4);
 queueObject.setObject("AAAAA");
 queue.add(queueObject);
 QueueObject queueObject1 = new QueueObject();
 queueObject1.setId(1);
 queueObject1.setObject("BBBBB");
 queue.add(queueObject1);
 QueueObject queueObject2 = new QueueObject();
 queueObject2.setId(3);
 queueObject2.setObject("CCCCC");
 queue.add(queueObject2);
 
 System.out.println(((QueueObject)queue.poll()).getObject());
 System.out.println(((QueueObject)queue.poll()).getObject());
 System.out.println(((QueueObject)queue.poll()).getObject());
 }
}
class QueueObject {
  private int id;
  private Object object;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public Object getObject() {
    return object;
  }
  public void setObject(Object object) {
    this.object = object;
  }
}
@SuppressWarnings("unchecked")
class Comparators implements Comparator{
  public int compare(Object arg0, Object arg1) {
    int val1 = ((QueueObject)arg0).getId();
    int val2 = ((QueueObject)arg1).getId();
    return val1 < val2 ? 0 : 1;
  }
}

注意事項(xiàng):

注意1:該隊(duì)列是用數(shù)組實(shí)現(xiàn),但是數(shù)組大小可以動(dòng)態(tài)增加,容量無限。

注意2:此實(shí)現(xiàn)不是同步的。不是線程安全的。如果多個(gè)線程中的任意線程從結(jié)構(gòu)上修改了列表, 則這些線程不應(yīng)同時(shí)訪問 PriorityQueue 實(shí)例,這時(shí)請(qǐng)使用線程安全的PriorityBlockingQueue 類。

注意3:不允許使用 null 元素。

注意4:此實(shí)現(xiàn)為插入方法(offer、poll、remove() 和 add 方法)提供 O(log(n)) 時(shí)間;

為 remove(Object) 和 contains(Object) 方法提供線性時(shí)間;
為檢索方法(peek、element 和 size)提供固定時(shí)間。

注意5:方法iterator()中提供的迭代器并不保證以有序的方式遍歷優(yōu)先級(jí)隊(duì)列中的元素。

至于原因可參考下面關(guān)于PriorityQueue的內(nèi)部實(shí)現(xiàn)

如果需要按順序遍歷,請(qǐng)考慮使用 Arrays.sort(pq.toArray())。

注意6:可以在構(gòu)造函數(shù)中指定如何排序。如:

  • PriorityQueue()
  • 使用默認(rèn)的初始容量(11)創(chuàng)建一個(gè) PriorityQueue,并根據(jù)其自然順序來排序其元素(使用 Comparable)。
  • PriorityQueue(int initialCapacity)
  • 使用指定的初始容量創(chuàng)建一個(gè) PriorityQueue,并根據(jù)其自然順序來排序其元素(使用 Comparable)。
  • PriorityQueue(int initialCapacity, Comparator comparator)
  • 使用指定的初始容量創(chuàng)建一個(gè) PriorityQueue,并根據(jù)指定的比較器comparator來排序其元素。

注意7:此類及其迭代器實(shí)現(xiàn)了 Collection 和 Iterator 接口的所有可選 方法。

PriorityQueue的內(nèi)部實(shí)現(xiàn)

PriorityQueue對(duì)元素采用的是堆排序,頭是按指定排序方式的最小元素。堆排序只能保證根是最大(最?。?,整個(gè)堆并不是有序的。

方法iterator()中提供的迭代器可能只是對(duì)整個(gè)數(shù)組的依次遍歷。也就只能保證數(shù)組的第一個(gè)元素是最小的

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于maven使用IDEA創(chuàng)建多模塊項(xiàng)目

    基于maven使用IDEA創(chuàng)建多模塊項(xiàng)目

    這篇文章主要介紹了基于maven使用IDEA創(chuàng)建多模塊項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • 詳解記錄Java Log的幾種方式

    詳解記錄Java Log的幾種方式

    很多小伙伴不知道如何記錄日志,今天特地整理了本篇文章,文中有非常詳細(xì)的介紹及代碼示例,對(duì)小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • JPA如何使用findBy方法自定義查詢

    JPA如何使用findBy方法自定義查詢

    這篇文章主要介紹了JPA如何使用findBy方法自定義查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java深度復(fù)制功能與用法實(shí)例分析

    Java深度復(fù)制功能與用法實(shí)例分析

    這篇文章主要介紹了Java深度復(fù)制功能與用法,簡(jiǎn)單講述了深度復(fù)制的概念、功能并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)深度復(fù)制的具體操作技巧,需要的朋友可以參考下
    2018-01-01
  • spring?security需求分析與基礎(chǔ)環(huán)境準(zhǔn)備教程

    spring?security需求分析與基礎(chǔ)環(huán)境準(zhǔn)備教程

    這篇文章主要為大家介紹了spring?security需求分析與基礎(chǔ)環(huán)境準(zhǔn)備教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Java調(diào)取創(chuàng)藍(lán)253短信驗(yàn)證碼的實(shí)現(xiàn)代碼

    Java調(diào)取創(chuàng)藍(lán)253短信驗(yàn)證碼的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java調(diào)取創(chuàng)藍(lán)253短信驗(yàn)證碼的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2018-04-04
  • springboot+HttpInvoke?實(shí)現(xiàn)RPC調(diào)用的方法

    springboot+HttpInvoke?實(shí)現(xiàn)RPC調(diào)用的方法

    RPC框架大家或多或少都用過,出自于阿里系的就有dubbo,HSF,sofaRPC等,今天通過本文給大家介紹springboot+HttpInvoke?實(shí)現(xiàn)RPC調(diào)用的方法,感興趣的朋友一起看看吧
    2022-03-03
  • 一篇文章弄懂JVM類加載機(jī)制過程以及原理

    一篇文章弄懂JVM類加載機(jī)制過程以及原理

    JVM原理對(duì)于初學(xué)者而言,比較晦澀難以理解,概念繁多又比較抽象,很多時(shí)候感覺看不見摸不著,還不好驗(yàn)證,下面這篇文章主要給大家介紹了關(guān)于如何通過一篇文章弄懂JVM類加載機(jī)制過程及原理的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • java遍歷Map的幾種方法分析

    java遍歷Map的幾種方法分析

    這篇文章主要介紹了java遍歷Map的幾種方法,結(jié)合實(shí)例形式分析了使用循環(huán)與迭代等方法操作Map遍歷的相關(guān)技巧,需要的朋友可以參考下
    2016-08-08
  • 搭建MyBatis-Plus框架并進(jìn)行數(shù)據(jù)庫增刪改查功能

    搭建MyBatis-Plus框架并進(jìn)行數(shù)據(jù)庫增刪改查功能

    這篇文章主要介紹了搭建MyBatis-Plus框架并進(jìn)行數(shù)據(jù)庫增刪改查,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評(píng)論