再次回顧一下之前的Collection的繼承體系
- Collection
- List
- ArrayList
- Vector
- LinkedList
- set
- HashSet
- TheeSet
- List
現在我們來看List相關的內容
1、List是Collection的子接口
特點:有序(存儲順序和取出順序一致),可重複
2、List的特有功能
a、添加功能
void add(int index, Object element):在指定位置添加元素
b、獲取功能
Object get(int index):獲取指定位置的元素
c、列表迭代器
ListIterator ListIterator():List集合特有的迭代器
d、Object remove(int index):根據索引刪除元素,返回被刪除的元素
e、Object set(int index,Object element):根據索引修改元素,返回被修飾的元素
3、List集合的特有遍歷功能
1、size和get結合
2、for循環遍歷
一般我們用增強for循環較多,這個就不在這裏贅述了,提到一下就好
4、List有列表迭代器這樣一個特色的功能,大家可以瞭解一下,可以實現逆向遍歷,但是必須要先正向遍歷
所以一般沒什麼意義,一般不用
5、併發修改異常
a、出現的現象:
迭代器遍歷集合,集合修改集合元素
b、原因
迭代器是依賴於集合的,而集合的改變迭代器並不知道
c、解決方案:
1、迭代器遍歷,迭代器更改(ListIterator)
元素添加在剛剛迭代的位置
2、集合遍歷,集合修改size和get
元素添加在集合的末尾
List的子類:
1、List的子類
1.List子類特點:
ArrayList
底層數據結構是數組,查詢快,增刪慢
線程不安全,效率高
Vector
底層數據結構是數組,查詢快,增刪慢
線程安全,效率低
LinkedList
底層數據結構是鏈表,查詢慢,增刪快
線程不安全,效率高
2.ArrayList
沒有特有功能要學習
案例:
1、ArrayList存儲字符串並遍歷
2、ArrayList存儲自定義字符串並遍歷
3.Vector
特有功能:
添加
public void addElement(E obj)-----add()
獲取
public E elementAt(int index)------get()
public Enumeration<E> elements()---iterator()
4.LinkedList
特有功能:
添加
addFirst()
addLast()
刪除
removeFirst()
removeLast()
獲取
getFirst()
getLast()
案例:
a、LinkedList存儲字符串並遍歷
b、LinkedList存儲自定義對象並遍歷
5.案例:
A、去除集合中的多個字符串的重複元素
如果字符串的內容相同,即爲重複元素
B、去除集合中的多個自定義對象的重複元素
如果自定義對象的成員變量值都相同,即爲重複元素
C、用LinkedList模擬一個棧數據結構的集合類,並測試
在JDK5之後出現了增強for循環
增強for:是for循環的一種
格式:
for(元素數據類型 變量: 數組或者Collection集合){
使用變量即可,該變量就是元素
}
好處:簡化了數組和集合的遍歷
弊端:增強for的目標不能爲null
如何解決呢?
對增強for的目標先判斷不爲空,再使用增強for
增強for其實是用來替代迭代器的
下面作爲一個補充,List之前考到過的面試題
List的面試題
List的子類特點
ArrayList:
底層數據結構是數組,查詢快,增刪慢
線程不安全,效率高
Vector:
底層數據結構是數組,查詢快,增刪慢
線程安全,效率低
LinkedList:
List接口的鏈表實現(雙重鏈表)
底層數據結構是鏈表,查詢慢,增刪快
線程不安全,效率高
List有三個子類,使用哪一個呢?
看情況,看需求。
要安全:Vector 即使要安全也不用,後面有替代的
不要安全:ArrayList或者LinkedList
查詢多:ArrayList
增刪多:LinkedList
所有案例代碼:https://github.com/ZhengXinYu666/Day_16