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來遍歷集合元素。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章