隊列(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方法:


還有常用方法是Map中的containsKey方法用于檢測當(dāng)前Map中是否包含給定的key。若當(dāng)前Map中包含給定的key(這里檢查是否包含是根據(jù)key的equals比較結(jié)果為依據(jù)的。)則返回true。
遍歷Map的三種方式:
1)遍歷所有的key ? 2)遍歷每一組鍵值對(Entry) ? 3)遍歷所有的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ù)字必須相同。

散列表中名詞:
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提高性能。