大家好,我是我是深圳分院第十期java學員,一枚正直純潔善良的Java程序員。今天給大家分享一下,修真院官網java任務一的擴展
1.背景介紹
Java容器類用於保存對象,集合主要分爲兩類:Collection 和 Map,
1) Collection
一組"對立"的元素,通常這些元素都服從某種規則
1.1) List必須保持元素特定的順序
1.2) Set不能有重複元素
1.3) Queue保持一個隊列(先進先出)的順序
2) Map
一組成對的"鍵值對"對象
Collection
什麼是集合?
集合,或者叫容器,是一個包含多個元素的對象;
集合可以對數據進行存儲,檢索,操作;
2.知識剖析
List 接口
List 接口
一個 List 是一個元素有序的、可以重複、可以爲 null 的集合(有時候我們也叫它“序列”)。
Java 集合框架中最常使用的幾種 List 實現類是 ArrayList,LinkedList 和 Vector。
在各種 List 中,最好的做法是以 ArrayList 作爲默認選擇。 當插入、刪除頻繁時,使用 LinkedList,
Vector 總是比 ArrayList 慢,所以要儘量避免使用它。
爲什麼 List 中的元素 “有序”、“可以重複”呢?
首先,List 的數據結構就是一個序列,
存儲內容時直接在內存中開闢一塊連續的空間,然後將空間地址與索引對應。
ArrayList:
ArrayList,本質是一個數組:
LinkedList, 雙向鏈表
.Set是一個不包含重複元素的 collection。更確切地講,
set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2,並且最多包含一個 null 元素。
正如其名稱所暗示的,此接口模仿了數學上的 set 抽象。
Stack棧是一種線性數據結構,遵從 LIFO(後進先出)的操作順序,
Queue隊列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,
而在表的後端(rear)進行插入操作。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭
在隊列這種數據結構中,最先插入的元素將是最先被刪除的元素;
反之最後插入的元素將是最後被刪除的元素,因此隊列又稱爲“先進先出”(FIFO—first in first out)的線性表
Map 中,任意一個 key 都有唯一確定的 value 與其對應,這個 key-value 的映射就是 map
Map 中元素的順序取決於迭代器迭代時的順序,有的實現類保證了元素輸入輸出時的順序,比如說 TreeMap;有的實現類則是無序的,比如 HashMap。
3.常見問題
LinkedList 與 ArrayList
ArrayList 是以數組實現的,遍歷時很快,但是插入、刪除時都需要移動後面的元素,效率略差些。
而LinkedList 是以雙向鏈表實現的,插入、刪除時只需要改變前後兩個節點指針指向即可,
4.編碼實戰
5.擴展思考
Iterator 迭代器
之前的遍歷,代碼和集合本身是緊密耦合的,無法將訪問邏輯從集合類和客戶端代碼中分離出來。
同時每一種集合對應一種遍歷方法,客戶端代碼無法複用
Iterator模式總是用同一種邏輯來遍歷集合。所有的內部狀態都由Iterator來維護。
客戶端從不直接和集合類打交道,它總是控制Iterator,向它發送"向前","向後","取當前元素"的命令,就可以間接遍歷整個集合。
public interface Iterator {
boolean hasNext();
Object next();
void remove();
}
Object next():返回迭代器剛越過的元素的引用,返回值是Object,需要強制轉換成自己需要的類型
boolean hasNext():判斷容器內是否還有可供訪問的元素
void remove():刪除迭代器剛越過的元素
6.參考文獻
百度,博客
7.更多討論
提問:
第一個問題:在查找時arraylist,linkedlist那個效率更高?
答:查找時arraylist更快,因爲內存是連在一起的,查找起來不需要去尋找存放數據的內存。這樣速度最快
第二個問題:STACK的應用場景
在內存設置中就使用棧來存放變量,可以方便我們取出最近設置的變量
第三個問題:QUEUE的應用場景
計算機及其網絡自身內部的各種計算資源,無論是多進程共享的 CPU 時間,還是多用戶共享的打印機,也都需要藉助隊列結構實現合理和優化的分配。