1. 程式人生 > >Java集合歸納-List

Java集合歸納-List

前言

昨天無意間翻看自己的部落格列表的時候才發現,集合部分的總結居然還有List的一部分沒有記錄,真是大意了。於是立刻翻出之前的讀書筆記,稍作整理,今天特意來補上這部分。學習的事,無論大小都還是要有頭有尾。

List摘要

List在儲存元素的實現機制上,於Map和Set有很大的區別。List集合在新增元素時按照元素的新增順序設定元素的索引,從0開始。因此List集合的元素時有序的,正因為其有序性,我們在取元素的時候可以根據索引精確到每一個元素,所以元素間是否重複就對元素的唯一性沒有太大的影響了。通過這個特徵,我們就可以輕鬆的記憶,List集合代表一個元素有序、可重複的集合

List的equals()方法

之前在講HashMap的時候,提到過判斷集合內元素間是否相等,需要equals()和hashCode()協同作業。List由於其集合內元素的有序不重複性,在作等價判斷時就簡單許多。List判斷兩個物件相等的標準是,只要兩個物件通過equals()方法比較返回true,那麼這兩個元素就是相等的

通過List實現佇列操作

在之前的筆試經歷中,遇到過這個問題,當時就想到了上面說的這點。通過重寫物件的equals()方法,讓其每次都返回true。List在呼叫remove()方法從集合中刪除一個重寫了equals()方法的物件時,由於每次返回true,所以List每次都是刪除集合中的第一個元素,模擬了佇列的出列操作。

package list;

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

class A{
    public boolean equals(Object obj){
        return true;

    }
}

public class ListTest {
    public static void main(String[] args) {
        List<String> war3Player = new ArrayList<String>();

        war3Player.add("sky"
); war3Player.add("lyn"); war3Player.add("moon"); System.out.println(war3Player); //出列 war3Player.remove(new A()); System.out.println(war3Player); //出列 war3Player.remove(new A()); System.out.println(war3Player); } }

執行結果如下所示:
這裡寫圖片描述

ArrayList和Vector

每個集合都有其執行緒安全和非執行緒安全實現子類,List也不例外。

  • 非執行緒安全:ArrayList
  • 執行緒安全:Vector

ArrayList和Vector作為List的兩個經典實現,自然完全支援List介面的全部功能,他們都是基於陣列實現的List類,所以ArrayList和Vector封裝了一個動態的、允許再分配的Object[]陣列。它們都有initialCapacity引數來設定陣列的長度,當ArrayList和Vector中新增的元素超出了陣列的原先長度時,它們的initialCapacity引數會自動增加。

有一點要提的是,由於Vector和hashtable一樣,是一個很古老的集合,也有很多類似addElement的長命名方法(其實和add方法沒有任何區別),方法上有功能重複,所以Vector在實際應用中有許多上古遺留下來的缺點,我們應該儘量避免使用它們。那麼就有人會問,那我們需要執行緒安全的List物件該怎麼辦呢?可以參照之前幾篇集合歸納說的,通常可以使用Collections工具類的Synchronized…裝飾符去建立一個執行緒安全的List,如下:

Collection collection = Collections.synchronizedCollection(new ArrayList());

或者

List list = Collections.synchronizedList(new ArrayList());

ArrayList和LinkedList

ArrayList和LinkedList實現的機制完全不同,ArrayList在上面說了,它的內部是以陣列的形式來儲存集合中的元素,因此隨機訪問集合中元素時有較好的效能;而LinkedList內部以連結串列的形式來儲存集合中元素,因此隨機訪問LinkedList中的元素時效能較差,但在插入、刪除元素時效能較為出色,只需要改變指標所指向的前一個和後一個節點的地址即可。

通過上面說的,我們可以做一個總結:

如果需要遍歷List的集合元素,對於ArrayList和Vector,應該使用隨機訪問的方法(get)來遍歷集合元素;對於LinkedList,則應當使用迭代器Iterator來遍歷集合元素。