天天看點

集合架構之List集合詳解

具有增删改查方法(collection不具備修改的方法)

List特有的常見方法:

add(int index,E element);

在清單的指定位置插入指定元素

addAll(int index, Collection c);

将指定 collection 中的所有元素都插入到清單中的指定位置

get(int index)

傳回清單中指定位置的元素

remove(int index)

移除清單中指定位置的元素

set(int index, E element)

用指定元素替換清單中指定位置的元素

subList(int fromIndex, int toIndex)

傳回清單中指定的 fromIndex(包括 )和 toIndex(不包括)之間的部分視圖

indexOf(Object o)

傳回此清單中第一次出現的指定元素的索引;如果此清單不包含該元素,則傳回 -1

lastIndexOf(Object o)

傳回此清單中最後出現的指定元素的索引;如果清單不包含此元素,則傳回 -1

toArray()

傳回按适當順序包含清單中的所有元素的數組(從第一個元素到最後一個元素)。

hasPrevious() :逆向周遊

如果以逆向周遊清單,清單疊代器有多個元素,則傳回 true。

ListIterator:清單疊代器

在疊代過程中可以使用ListIterator對象操作元素,不會引起并發異常

hasPrevious() :逆向周遊

如果以逆向周遊清單,清單疊代器有多個元素,則傳回 true。

previous()

傳回清單中的前一個元素,配合hasPrevious()方法使用。

listIterator(int index)

傳回清單中元素的清單疊代器(按适當順序),從清單的指定位置開始

在疊代器疊代過程中,不能操作集合,會引起并發修改異常。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("張三");
        list.add("李四");
        list.add("王五");
        list.add("趙六");

        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String name = it.next();
            if (name.equals("王五")) {
                list.add("旺财");
            }
            System.out.println(name);
        }
    }
}
           

此時會出現java.util.ConcurrentModificationException異常(并發修改異常)

可以使用Iterator的子接口ListIterator,隻有List集合具有ListIterator疊代器。

通過ListIterator對象it來完成在疊代中對元素進行增删改查(注意:使用集合對象list直接操作仍然會報錯)

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ListTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("張三");
        list.add("李四");
        list.add("王五");
        list.add("趙六");

        ListIterator<String> it = list.listIterator();
        while (it.hasNext()) {
            String name = it.next();
            if (name.equals("王五")) {
                it.add("旺财");
            }
            System.out.println(name);
        }
    }
}
           

List集合的子類對象

Vector:

是線程同步的, Vector 類可以實作可增長的對象數組,與數組一樣,它包含可以使用整數索引進行通路的元件。但是,Vector 的大小可以根據需要增大或縮小,以适應建立 Vector 後進行添加或移除項的操作。

Vector可以包含指定 collection 中的元素,這些元素按其 collection 的疊代器傳回元素的順序排列。

Vector在建立時可以指定初始容量和容量增量,如果隻指定初始容量,則容量增量預設等于初始容量。

ArrayList:

基本等同Vector,性能優于Vector,不同步,線程不安全

内部是數組資料結構,是不同步的,替代了Vector,Vector幾乎不用了,多線程時可以給其加鎖,查詢速度快。

可以包含指定 collection 中的元素,這些元素按其 collection 的疊代器傳回元素的順序排列。

可以指定初始容量大小。

LinkedList:

内部是連結清單資料結構,是不同步的,增删元素速度快

特有方法:

addFirst():将指定元素插入此清單的開頭。

addLast():将指定元素添加到此清單的結尾。

getFirst():傳回此清單的第一個元素。

getLast():傳回此清單的最後一個元素。

removeFirst():移除并傳回此清單的第一個元素。

boolean removeFirstOccurrence(Object o):從此清單中移除第一次出現的指定元素(從頭部到尾部周遊清單時)。

removeLast():移除并傳回此清單的最後一個元素。

List三個子類的優缺點比較:

  1. Vector & ArrayList

    1) Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe),而ArrayList的方法不是,由于線程的同步必然要影響性能,是以,ArrayList的性能比Vector好。

    2) 當Vector或ArrayList中的元素超過它的初始大小時,Vector會将它的容量翻倍,而ArrayList隻增加50%的大小,這樣,ArrayList就有利于節約記憶體空間。

  2. ArrayList & LinkedList

    ArrayList的内部實作是基于内部數組Object[],是以從概念上講,它更象數組,但LinkedList的内部實作是基于一組連接配接的記錄,是以,它更象一個連結清單結構,是以,它們在性能上有很大的差别:

從上面的分析可知,在ArrayList的前面或中間插入資料時,你必須将其後的所有資料相應的後移,這樣必然要花費較多時間,是以,當你的操作是在一列資料的後面添加資料而不是在前面或中間,并且需要随機地通路其中的元素時,使用ArrayList會提供比較好的性能;

而通路連結清單中的某個元素時,就必須從連結清單的一端開始沿着連接配接方向一個一個元素地去查找,直到找到所需的元素為止,是以,當你的操作是在一列資料的前面或中間添加或删除資料,并且按照順序通路其中的元素時,就應該使用LinkedList。