NO.26 隊列和棧、Map查詢表

隊列(Queue)是常用的數(shù)據(jù)結(jié)構(gòu),可以將隊列看成特殊的線性表,隊列限制了對線性表的訪問方式:只能從線性表的一端添加(offer)元素,從另一端取出(poll)元素。

隊列遵循先進先出(FIFO First Input First Output )的原則。

JDK中提供了Queue接口,同時使得LinkedList實現(xiàn)了該接口(選擇LinkedList實現(xiàn)Queue的原因在于Queue經(jīng)常要進行插入和刪除的操作,而LinkedList在這方面效率較高)。

Queue方法:

隊列

遍歷元素:


Deque是Queue的子接口,定義了所謂“雙端隊列”即從隊列的兩端分別可以入隊(offer)和出隊(poll),LinkedList實現(xiàn)了該接口。

Deque方法:

雙端隊列

如果將Deque限制為只能從一端入隊和出隊,則可實現(xiàn)“?!保⊿tack)的數(shù)據(jù)結(jié)構(gòu),對于棧而言,入棧稱之為push,出棧稱之為pop。

棧遵循先進后出(FILO First Input Last Output )的原則。

棧的方法:


java提供了一組可以以鍵值對(key-value)的形式存儲數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)稱為Map。我們可以把Map看成一個多行兩列的表格,其中第一列存放key,第二列存放value。

而每一行就相當(dāng)于一組key-value對,表示一組數(shù)據(jù)。

Map對存入的元素有一個要求,就是key不能重復(fù),所謂不能重復(fù)指的是在Map中不能包含兩個equals為true的key。

Map對于key,value的類型沒有嚴(yán)格要求,只要是引用類型均可。但是為了保證在使用時不會造成數(shù)據(jù)混亂,通常我們會使用泛型去約束key與value的類型。

常用實現(xiàn)類:java.util.HashMap(哈希表,散列表)----TreeMap 二叉樹實現(xiàn)。

Map方法:

put、get方法
remove方法

還有常用方法是Map中的containsKey方法用于檢測當(dāng)前Map中是否包含給定的key。若當(dāng)前Map中包含給定的key(這里檢查是否包含是根據(jù)key的equals比較結(jié)果為依據(jù)的。)則返回true。

遍歷Map的三種方式:

1)遍歷所有的key ? 2)遍歷每一組鍵值對(Entry) ? 3)遍歷所有的value(相對不常用)

兩種常用遍歷方法
遍歷value值

關(guān)于HashMap:

影響散列表(HashMap)查詢性能的一個主要因素就是作為Key元素equals方法與hashcode方法的結(jié)果。妥善重寫這兩個方法可以避免在HashMap中出現(xiàn)鏈表導(dǎo)致HashMap檢索性能降低。

API手冊對這兩個方法的重寫有說明,重寫原則:

1)成對重寫。即:當(dāng)我們需要重寫一個類的equals方法時就應(yīng)當(dāng)連同重寫hashcode

2)一致性。即:當(dāng)兩個對象equals比較為true時,hashcode方法返回的數(shù)字應(yīng)當(dāng)相等。反之亦然。雖然反之不是必須的,但是應(yīng)當(dāng)保證兩個對象hashcode值相等時,equals方法比較為true,否則這樣的對象在作為key元素在HashMap中使用時會產(chǎn)生鏈表,降低HashMap查詢性能。

3)穩(wěn)定性。即:當(dāng)參與equals比較的屬性沒有發(fā)生變化的前提下,多次調(diào)用hashcode方法返回的數(shù)字必須相同。

一起重寫兩個方法(eclipse右鍵Source可自動生成)

散列表中名詞:

Capacity:容量, hash表里bucket(桶)的數(shù)量,也就是散列數(shù)組大小

Initial capacity:初始容量,創(chuàng)建hash表的時 初始bucket的數(shù)量, 默認(rèn)構(gòu)建容量是16,也可以使用特定容量

Size : 大小, 當(dāng)前散列表中存儲數(shù)據(jù)的數(shù)量

Load factor:加載因子,默認(rèn)值0.75(就是75%), 向散列表增加數(shù)據(jù)時如果 size/capacity 的值大于Load factor則發(fā)生擴容并且重新散列(rehash)

注:當(dāng)加載因子較小時候散列查找性能會提高, 同時也浪費了散列桶空間容量。 0.75是性能和空間相對平衡結(jié)果。在創(chuàng)建散列表時候指定合理容量, 從而可以減少rehash提高性能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 1,225評論 0 16
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,918評論 0 11
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,658評論 0 3
  • 1.Java集合框架是什么?說出一些集合框架的優(yōu)點? 每種編程語言中都有集合,最初的Java版本包含幾種集合類:V...
    獨念白閱讀 885評論 0 2
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,895評論 11 349

友情鏈接更多精彩內(nèi)容