List介面及其主要實現類
List介面繼承和擴充套件了Collection介面,List介面表示具有順序的集合,其中可以包含重複元素。使用此介面的實現類時,可以對列表中每個元素的插入位置進行精確的控制,使用者可以根據元素的整數索引(在列表中的位置)訪問元素,並搜尋列表中的元素。List介面中宣告的常用方法如表1所示
方法宣告 | 方法功能 |
void add(int index,Object element) | 在列表的index位置新增元素 |
Object remove(int index) | 刪除列表中index位置的元素 |
Object get(int index) | 返回列表index位置的元素 |
Object set(int index,Object element) | 用指定元素替換列表中指定位置的元素 |
int indexOf(Object o) | 返回列表中首次出現指定元素的索引,如果列表中不包含此元素,則返回-1 |
int lastIndexOf(Object o) | 返回列表中最後出現指定元素的索引,如果列表中不包含此元素,則返回-1 |
List介面的實現類主要有ArrayList、Stack、Vector和LinkedList。
1、ArrayList類
ArrayList類以陣列為資料結構實現了List介面,用於表述長度可變的陣列列表。在ArrayList中使用物件陣列儲存資料,呼叫new ArrayList()後,它會預設初始化一個size=10的陣列。每次add操作都要檢查陣列容量,如果不夠,重新設定一個初始容量為1.5倍大小的新陣列,然後再把每個元素複製過去。在陣列中間插入或刪除,都要移動後面的所有元素。
ArrayList實際上是一種容器(Collection),其中可以儲存任意數量的元素,每個元素都是一個物件。宣告和建立ArrayList物件時,還需要指定元素的型別,例如
ArrayList<String> notes=new ArrayList<String>();
ArrayList類中的常用方法
方法宣告 | 方法功能 |
public boolean add(E o) | 向ArrayList容器中新增元素 |
public int size() | 獲得ArrayList容器中元素的個數 |
public E get(int index) | 返回index位置的元素 |
public E remove(int index) | 刪除index位置的元素 |
2、Vector向量
Vector類也實現了List介面,也用於表述長度可變的物件陣列表列。與ArrayList的差別是:Vector是同步(執行緒安全)的,執行效率低,主要用於線上程環境中;而ArrayList是不同步的,適合在單執行緒環境中使用。除了實現了List介面中定義的方法外,Vector常用方法如下表所示
方法宣告 | 方法功能 |
public Vector() | 構造一個空向量,使其內部資料陣列的大小為10,其標準容量增量為零 |
public E elementAt(int index) | 返回index位置的元素 |
public void addElement(E obj) | 在向量末尾新增元素 |
public void removeElementAt(int index) | 移除index位置的元素 |
public void insertElementAt(E obj,int index) | 將指定元素插入到指定位置 |
public boolean removeElement(Object obj) | 從此向量中移除第一個匹配項 |
public void remove AllElements() | 從此向量中移除全部元素,並將其大小設定為零 |
public Object[] toArray() | 返回一個數組,包含此向量中以正確順序存放的所有元素 |
3、Stack堆疊
堆疊是一種“後進先出”的資料結構,只能在一端進行輸入或輸出資料的操作。java.util.Stack類繼承了Vector類,對應資料結構中以“後進先出”方式儲存和操作資料的線性表,即物件棧。
方法宣告 | 方法功能 |
pubic Stack() | 建立一個空Stack |
pubic Object push(E item) | 把項壓入棧頂 |
public Object pop() | 移除棧頂元素 |
public Object peek() | 檢視棧頂元素 |
public boolean empty() | 判斷棧是否為空 |
public int search(Object o) | 返回物件在棧中的位置,以1為基數 |
4、LinkedList佇列
LinkedList實現的是一個雙向連結串列。每個節點除含有元素外,還包含向前、向後的指標。在連結串列結構中,每個元素都擁有兩個指標屬性,一個是指向上一個元素的previous指標,一個是指向下一個元素的next指標,第一個元素的previous指標指向“空”,最後一個元素的next指標指向“空”。增加結點,只會對連結串列的指標進行操作,速度快。LinkedList有雙向佇列的特徵,在連結串列兩端可增刪資料。使用index查詢物件時,會以index和size/2比較,從前或從後向中間搜尋。
比較ArrayList和LinkedList的結構,可以得到以下結論。
ArrayList的remove和add(index,Object)操作代價高,需要移動後面的每個元素。
LinkedList採用連結串列資料結構實現,便於元素的插入和刪除,它的get(index)操作代價高,要先迴圈遍歷list找到Object