# List、Set
1. 數據結構
* 棧結構:先進後出
* 隊列結構:先進先出
* 數組結構:是有序的元素序列,數組是在內存中開闢一段連續的空間,並在此空間存放元素。就像是一排出租屋,有100個房間,從001到100每一個房間都有固定編號,經過編號就能夠快速找到租房子的人。
* 數組特色:查詢快,增刪慢。且數組的長度在內存中是固定的,不可改變。存儲位置連續
* 指定索引位置增長元素:須要建立一個新數組,將指定新元素存儲在指定索引位置,再把原數組元素根據索引,複製到新數組對應索引的位置。
* 指定索引位置刪除元素:須要建立一個新數組,把原數組元素根據索引,複製到新數組對應索引的位置,原數組中指定索引位置元素不復制到新數組中。
* 鏈表結構:由一系列結點node(鏈表中每個元素稱爲結點)組成,結點能夠在運行時i動態生成。每一個結點包括兩個部分:一個是存儲數據元素的數據域,另外一個是存儲下一個結點地址的指針域。常說的鏈表分爲單項鍊表和雙向鏈表,單項鍊表每一個結點只能指向下一個結點,而雙向鏈表能夠指向前一個和下一個結點。
* 鏈表特色:
* 查找元素慢:想查找某個元素,須要經過鏈接的節點,依次向後查找指定元素
* 增刪元素快:
增長元素:只須要修改鏈接下個元素的地址便可。
刪除元素:只須要修改鏈接下個元素的地址便可。
* 長度不固定,存儲位置不必定連續
2. List
1. 特色
有序(存進去和取出來的順序一致)
有索引,方便查詢,可是增刪元素較慢
能夠存儲重複元素
2. 特有方法(可以使用索引的方法)
* void add(int index,E e):給指定的位置添加元素
* E remove(int index):刪除指定位置元素,並返回bool類型的刪除結果
* E set(int index,E e):修改指定位置的元素爲e,並返回被修改的原數據。
* E get(int index):獲取指定位置元素
3. ArrayList<T>
* 使用數組結構,查詢快,增刪慢
4. LinckedList<T>
* 底層是鏈表結構,查詢慢,增刪快
* 能夠進行首位操做,因此Lincked有6個特有方法:
* addFirst() addLast()
* removeFirst() removeLast()
* getFirst() getLast()
5. Vector
* 底層也是數組結構
* Vector與ArrayList的區別:
* 相同點:
底層都是數組結構,特色就是查詢塊,增刪慢
不一樣點:
Vector是線程安全的,效率低
ArrayList線程不安全的,效率高
3. Set
1. HashSet(無序,不可重複,無索引)
* LinkedHashSet:有序
* 如何保證Set集合內元素惟一呢?
* 依賴兩個方法hashCode方法,equals方法
先執行hashCode方法,會和集合中的每個元素的hash值進行比較,若是不一樣,直接添加
若是相同,執行equals方法判斷,若是相同,就不添加,若是不一樣就添加元素
2. 集合使用的選擇:
容許存儲重複元素:
是:使用List集合
查詢多仍是增刪多
查詢多:選擇ArrayList
增刪多:選擇LinkedList
不知道是查詢多仍是增刪多,就使用ArrayList
否:使用set集合
有序嗎?
是:選擇LinkedHashSet
否:選擇HashSet
不知道是否有序使用HashSet
什麼都不知道選擇ArrayList
適當的狀況選擇適合的容器能夠增長咱們的代碼效率
4. 可變參數
定義:
修飾符 返回值類型 方法名(數據類型... 參數名) {
在方法中使用參數參數就能夠看作是數組
}
使用:
方法名(參數) // 參數能夠是0個,也能夠是多個
5. Collections工具類
* 特色:
構造方法私有
成員靜態
*方法:
sort(List list):按照天然排序
sort(List list, Compartor c): 按照比較器進行排序
天然排序就是按照默認規則由小到大排序(集合內容是可比較的類型)
比較器排序: 集合中存儲的元素的類型實現了Comparable(可比較的)接口
ArrayList<String> list = new ArrayList<>();
Collections.sort(list, new Compartor() {
重寫方法
});node