Java List集合:ArrayList類、LinkList類、ArrayList類和LinkList類的區別

2020-07-16 10:05:20
List 介面實現了 Collection 介面,它主要有兩個實現類:ArrayList 類和 LinkedList 類。在 List 集合中允許出現重複元素。與 Set 集合不同的是,在 List 集合中的元素是有序的,可以根據索引位置來檢索 List 集合中的元素,第一個新增到 List 集合中的元素的索引為 0,第二個為 1,依此類推。

ArrayList 類

ArrayList 類提供了快速的基於索引的成員存取方式,對尾部成員的增加和刪除支援較好。使用 ArrayList 建立的集合,允許對集合中的元素進行快速的隨機存取,不過,向 ArrayList 中插入與刪除元素的速度相對較慢。該類的常用構造方法有如下兩種過載形式。
  • ArrayList():構造一個初始容量為 10 的空列表。
  • ArrayList(Collection<?extends E>c):構造一個包含指定 Collection 的元素的列表,這些元素是按照該 Collection 的疊代器返回它們的順序排列的。

ArrayList 類除了包含 Collection 介面中的所有方法之外,還包括 List 介面中提供的如表 1 所示的方法。

表1 ArrayList類的常用方法
方法名稱 說明
E get(int index) 獲取此集合中指定索引位置的元素,E 為集合中元素的資料型別
int index(Object o) 返回此集合中第一次出現指定元素的索引,如果此集合不包含該元
素,則返回 -1
int lastIndexOf(Object o) 返回此集合中最後一次出現指定元素的索引,如果此集合不包含該
元素,則返回 -1
E set(int index, Eelement) 將此集合中指定索引位置的元素修改為 element 引數指定的物件。
此方法返回此集合中指定索引位置的原元素
List<E> subList(int fromlndex, int tolndex) 返回一個新的集合,新集合中包含 fromlndex 和 tolndex 索引之間
的所有元素。包含 fromlndex 處的元素,不包含 tolndex 索引處的
元素

例 1

使用 ArrayList 類向集合中新增三個商品資訊,包括商品編號、名稱和價格,然後遍歷集合輸出這些商品資訊。

1)建立一個商品類 Product,在該類中定義 3 個屬性和 toString() 方法,分別實現 setter/getter 方法。程式碼的實現如下:
public class Product {
    // 商品類
    private int id; // 商品編號
    private String name; // 名稱
    private float price; // 價格

    public Product(int id, String name, float price) {
        this.name = name;
        this.id = id;
        this.price = price;
    }

    // 這裡是上面3個屬性的setter/getter方法,這裡省略
    public String toString() {
        return "商品編號:" + id + ",名稱:" + name + ",價格:" + price;
    }
}
2)建立一個測試類,呼叫 Product 類別建構函式範例化三個物件,並將 Product 物件儲存至 ArrayList 集合中。最後遍歷該集合,輸出商品資訊。測試類的程式碼實現如下:
public class Test {
    public static void main(String[] args) {
        Product pd1 = new Product(4, "木糖醇", 10);
        Product pd2 = new Product(5, "洗髮水", 12);
        Product pd3 = new Product(3, "熱水壺", 49);
        List list = new ArrayList(); // 建立集合
        list.add(pd1);
        list.add(pd2);
        list.add(pd3);
        System.out.println("*************** 商品資訊 ***************");
        for (int i = 0; i < list.size(); i++) {
            // 迴圈遍歷集合,輸出集合元素
            Product product = (Product) list.get(i);
            System.out.println(product);
        }
    }
}
該範例中的 ArrayList 集合中存放的是自定義類 Product 的物件,這與儲存的 String 類的物件是相同的。與 Set 不同的是,List 集合中存在 get() 方法,該方法可以通過索引來獲取所對應的值,獲取的值為 Object 類,因此需要將該值轉換為 Product 類,從而獲取商品資訊。

該程式的執行結果如下所示。
*************** 商品資訊 ***************
商品編號:4,名稱:木糖醇,價格:10.0
商品編號:5,名稱:洗髮水,價格:12.0
商品編號:3,名稱:熱水壺,價格:49.0

例 2

在使用 List 集合時需要注意區分 indexOf() 方法和 lastIndexOf() 方法。前者是獲得指定物件的最小索引位置,而後者是獲得指定物件的最大索引位置。前提條件是指定的物件在 List 集合中有重複的物件,否則這兩個方法獲取的索引值相同。

下面的案例程式碼演示了 indexOf() 方法和 lastIndexOf() 方法的區別。
public static void main(String[] args) {
    List list = new ArrayList();
    list.add("One");
    list.add("|");
    list.add("Two");
    list.add("|");
    list.add("Three");
    list.add("|");
    list.add("Four");
    System.out.println("list 集合中的元素數量:" + list.size());
    System.out.println("list 集合中的元素如下:");
    Iterator it = list.iterator();
    while (it.hasNext()) {
        System.out.print(it.next() + "、");
    }
    System.out.println("n在 list 集合中'丨'第一次出現的位置是:" + list.indexOf("|"));
    System.out.println("在 list 集合中'丨'最後一次出現的位置是:" + list.lastIndexOf("|"));
}
上述程式碼建立一個 List 集合 list,然後新增了 7 個元素,由於索引從 0 開始,所以最後一個元素的索引為 6。輸出結果如下:
list 集合中的元素數量:7
list 集合中的元素如下:
One、|、Two、|、Three、|、Four、
在 list 集合中'|'第一次出現的位置是:1
在 list 集合中'|'最後一次出現的位置是:5

例 3

使用 subList() 方法擷取 List 集合中部分元素時要注意,新的集合中包含起始索引位置的元素,但是不包含結束索引位置的元素。例如,subList(1,4) 方法實際擷取的是索引 1 到索引 3 的元素,並組成新的 List 集合。

下面的案例程式碼演示了 subList() 方法的具體用法。
public static void main(String[] args) {
    List list = new ArrayList();
    list.add("One");
    list.add("Two");
    list.add("Three");
    list.add("Four");
    list.add("Five");
    list.add("Six");
    list.add("Seven");
    System.out.println("list 集合中的元素數量:" + list.size());
    System.out.println("list 集合中的元素如下:");
    Iterator it = list.iterator();
    while (it.hasNext()) {
        System.out.print(it.next() + "、");
    }
    List sublist = new ArrayList();
    sublist = list.subList(2, 5); // 從list集合中擷取索引2~5的元素,儲存到sublist集合中
    System.out.println("nsublist 集合中元素數量:" + sublist.size());
    System.out.println("sublist 集合中的元素如下:");
    it = sublist.iterator();
    while (it.hasNext()) {
        System.out.print(it.next() + "、");
    }
}
輸出結果如下:
list 集合中的元素數量:7
list 集合中的元素如下:
One、Two、Three、Four、Five、Six、Seven、
sublist 集合中元素數量:3
sublist 集合中的元素如下:
Three、Four、Five、

LinkList類

LinkedList 類採用連結串列結構儲存物件,這種結構的優點是便於向集合中插入或者刪除元素。需要頻繁向集合中插入和刪除元素時,使用 LinkedList 類比 ArrayList 類效果高,但是 LinkedList 類隨機存取元素的速度則相對較慢。這裡的隨機存取是指檢索集合中特定索引位置的元素。

LinkedList 類除了包含 Connection 介面和 List 介面中的所有方法之外,還特別提供了表 2 所示的方法。

表 2 LinkList類中的方法
方法名稱 說明
void addFirst(E e) 將指定元素新增到此集合的開頭
void addLast(E e) 將指定元素新增到此集合的末尾
E getFirst() 返回此集合的第一個元素
E getLast() 返回此集合的最後一個元素
E removeFirst() 刪除此集合中的第一個元素
E removeLast() 刪除此集合中的最後一個元素

例 4

在倉庫管理系統中要記錄入庫的商品名稱,並且需要輸出第一個錄入的商品名稱和最後—個商品名稱。下面使用 LinkedList 集合來完成這些功能,實現程式碼如下:
public class Test {
    public static void main(String[] args) {
        LinkedList<String> products = new LinkedList<String>(); // 建立集合物件
        String p1 = new String("六角螺母");
        String p2 = new String("10A 電纜線");
        String p3 = new String("5M 捲尺");
        String p4 = new String("4CM 原木方板");
        products.add(p1); // 將 p1 物件新增到 LinkedList 集合中
        products.add(p2); // 將 p2 物件新增到 LinkedList 集合中
        products.add(p3); // 將 p3 物件新增到 LinkedList 集合中
        products.add(p4); // 將 p4 物件新增到 LinkedList 集合中
        String p5 = new String("標準資料夾小櫃");
        products.addLast(p5); // 向集合的末尾新增p5物件
        System.out.print("*************** 商品資訊 ***************");
        System.out.println("n目前商品有:");
        for (int i = 0; i < products.size(); i++) {
            System.out.print(products.get(i) + "t");
        }
        System.out.println("n第一個商品的名稱為:" + products.getFirst());
        System.out.println("最後一個商品的名稱為:" + products.getLast());
        products.removeLast(); // 刪除最後一個元素
        System.out.println("刪除最後的元素,目前商品有:");
        for (int i = 0; i < products.size(); i++) {
            System.out.print(products.get(i) + "t");
        }
    }
}
如上述程式碼,首先建立了 5 個 String 物件,分別為 p1、p2、p3、p4 和 p5。同時將 p1、 p2、p3 和 p4 物件使用 add() 方法新增到 LinkedList 集合中,使用 addLast() 方法將 p5 物件新增到 LinkedList 集合中。分別呼叫 LinkedList 類中的 getFirst() 方法和 getLast() 方法獲取第一個和最後一個商品名稱。最後使用 removeLast() 方法將最後一個商品資訊刪除,並將剩餘商品資訊列印出來。

LinkedList<String> 中的 <String> 是 Java 中的泛型,用於指定集合中元素的資料型別,例如這裡指定元素型別為 String,則該集合中不能新增非 String 型別的元素。

執行程式,執行結果如下:
*************** 商品資訊 ***************
目前商品有:
六角螺母    10A 電纜線    5M 捲尺    4CM 原木方板    標準資料夾小櫃   
第一個商品的名稱為:六角螺母
最後一個商品的名稱為:標準資料夾小櫃
刪除最後的元素,目前商品有:
六角螺母    10A 電纜線    5M 捲尺    4CM 原木方板