標籤:學習 dem 返回 etl 特點 ali 插入 linked arraylist
List介面
我們掌握了Collection介面的使用後,再來看看Collection介面中的子類,他們都具備那些特性呢?
接下來,我們一起學習Collection中的常用幾個子類(List集合、Set集合)。
List介面介紹
查閱API,看List的介紹。有序的 collection(也稱為序列)。此介面的使用者可以對列表中每個元素的插入位置進行精確地控制。使用者可以根據元素的整數索引(在列表中的位置)訪問元素,並搜尋列表中的元素。與 set 不同,列表通常允許重複的元素。
看完API,我們總結一下:
List介面:
l 它是一個元素存取有序的集合。例如,存元素的順序是11、22、33。那麼集合中,元素的儲存就是按照11、22、33的順序完成的)。
l 它是一個帶有索引的集合,通過索引就可以精確的操作集合中的元素(與數組的索引是一個道理)。
l 集合中可以有重複的元素,通過元素的equals方法,來比較是否為重複的元素。
List介面的常用子類有:
ArrayList集合
LinkedList集合
List介面中常用的方法
增加元素方法
add(Object e):向集合末尾處,添加指定的元素
add(int index, Object e):向集合指定索引處,添加指定的元素,原有元素依次後移
刪除元素刪除
remove(Object e):將指定元素對象,從集合中刪除,傳回值為boolean
remove(int index):將指定索引處的元素,從集合中刪除,傳回值為被刪除的元素
替換元素方法
set(int index, Object e):將指定索引處的元素,替換成指定的元素,傳回值為替換前的元素已存在的
查詢元素方法
get(int index):擷取指定索引處的元素,並返回該元素
方法示範:
List<String> list = new ArrayList<String>();
//1,添加元素。
list.add("小紅");
list.add("小梅");
list.add("小強");
//2,插入元素。插入元素前的集合["小紅","小梅","小強"]
list.add(1, "老王"); //插入元素後的集合["小紅","老王","小梅","小強"]
//3,刪除元素。
list.remove(2);// 刪除元素後的集合["小紅","老王","小強"]
//4,修改元素。
list.set(1, "隔壁老王");// 修改元素後的集合["小紅","隔壁老王","小強"]
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String str = it.next();
System.out.println(str);
}
由於List集合擁有索引,因此List集合迭代方式除了使用迭代器之外,還可以使用索引進行迭代。
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
System.out.println(str);
}
Iterator的並發修改異常
在list集合迭代元素中,對元素進行判斷,一旦條件滿足就添加一個新元素。代碼如下
public class IteratorDemo {
//在list集合迭代元素中,對元素進行判斷,一旦條件滿足就添加一個新元素
public static void main(String[] args) {
//建立List集合
List<String> list = new ArrayList<String>();
//給集合中添加元素
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");
//迭代集合,當有元素為"abc2"時,集合加入新元素"a"
Iterator<String> it = list.iterator();
while(it.hasNext()){
String str = it.next();
//判斷取出的元素是否是"abc2",是就添加一個新元素
if("abc2".equals(str)){
list.add("a");// 該操作會導致程式出錯
}
}
//列印容器中的元素
System.out.println(list);
}
}
運行上述代碼發生了錯誤 java.util.ConcurrentModificationException[L1] 這是什麼原因呢?
在迭代過程中,使用了集合的方法對元素進行操作。導致迭代器並不知道集合中的變化,容易引發資料的不確定性。
並發修改異常解決辦法:在迭代時,不要使用集合的方法操作元素。
那麼想要在迭代時對元素操作咋辦?通過ListIterator迭代器操作元素是可以的,ListIterator的出現,解決了使用Iterator迭代過程中可能會發生的錯誤情況。
List集合儲存資料的結構
List介面下有很多個集合,它們儲存元素所採用的結構方式是不同的,這樣就導致了這些集合有它們各自的特點,供給我們在不同的環境下進行使用。資料存放區的常用結構有:堆棧、隊列、數組、鏈表。我們分別來瞭解一下:
堆棧,採用該結構的集合,對元素的存取有如下的特點:
n 先進後出(即,存進去的元素,要在它後面的元素依次取出後,才能取出該元素)。例如,子彈壓進彈夾,先壓進去的子彈在下面,後壓進去的子彈在上面,當開槍時,先彈出上面的子彈,然後才能彈出下面的子彈。
n 棧的入口、出口的都是棧的頂端位置
n 壓棧:就是存元素。即,把元素儲存到棧的頂端位置,棧中已有元素依次向棧底方向移動一個位置。
n 彈棧:就是取元素。即,把棧的頂端位置元素取出,棧中已有元素依次向棧頂方向移動一個位置。
l 隊列,採用該結構的集合,對元素的存取有如下的特點:
n 先進先出(即,存進去的元素,要在後它前面的元素依次取出後,才能取出該元素)。例如,安檢。排成一列,每個人依次檢查,只有前面的人全部檢查完畢後,才能排到當前的人進行檢查。
l 數組,採用該結構的集合,對元素的存取有如下的特點:
n 尋找元素快:通過索引,可以快速存取指定位置的元素
n 增刪元素慢:原因是長度不可變
鏈表,採用該結構的集合,對元素的存取有如下的特點:
n 多個節點之間,通過地址進行串連。例如,多個人手拉手,每個人使用自己的右手拉住下個人的左手,依次類推,這樣多個人就連在一起了。
n 尋找元素慢:想尋找某個元素,需要通過串連的節點,依次向後尋找指定元素
n 增刪元素快:
ArrayList集合
ArrayList集合資料存放區的結構是數組結構。元素增刪慢,尋找快,由於日常開發中使用最多的功能為查詢資料、遍曆資料,所以ArrayList是最常用的集合。
許多程式員開發時非常隨意地使用ArrayList完成任何需求,並不嚴謹,這種用法是不提倡的。
LinkedList集合
LinkedList集合資料存放區的結構是鏈表結構。方便元素添加、刪除的集合。實際開發中對一個集合元素的添加與刪除經常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。
LinkedList是List的子類,List中的方法LinkedList都是可以使用,這裡就不做詳細介紹,我們只需要瞭解LinkedList的特有方法即可。在開發時,LinkedList集合也可以作為堆棧,隊列的結構使用。
方法示範:
LinkedList<String> link = new LinkedList<String>();
//添加元素
link.addFirst("abc1");
link.addLast("abc2");
link.addFirst("abc3");
//擷取元素
System.out.println(link.getFirst());
System.out.println(link.getLast());
//刪除元素
System.out.println(link.removeFirst());
System.out.println(link.removeLast());
while(!link.isEmpty()){ //判斷集合是否為空白
System.out.println(link.pop()); //彈出集合中的棧頂元素
}
Vector集合
Vector集合資料存放區的結構是數組結構,為JDK中最早提供的集合。Vector中提供了一個獨特的取出方式,就是枚舉Enumeration,它其實就是早期的迭代器。此介面Enumeration的功能與 Iterator 介面的功能是類似的。Vector集合已被ArrayList替代。枚舉Enumeration已被迭代器Iterator替代。
l Vector常見的方法:
l Enumeration枚舉常見的方法:
l Vector集合對ArrayList集合使用的對比
java -> List介面