java中的ArrayList 、List、LinkedList、Collection關係詳解

原文地址https://www.cnblogs.com/liqiu/p/3302607.html

一、基礎介紹(Set、List、Map)

  • Set(集):集合中的元素不按特定方式排序,並且沒有重複對象。他的有些實現類能對集合中的對象按特定方式排序。
  • List(列表):集合中的元素按索引位置排序,可以有重複對象,允許按照對象在集合中的索引位置檢索對象。
  • Map(映射):集合中的每一個元素包含一對鍵對象和值對象,集合中沒有重複的鍵對象,值對象可以重複。他的有些實現類能對集合中的鍵對象進行排序。

 

二、基本接口和類型

1、Iterator接口 

    該接口允許遍歷集合中的所有元素,一共有三個方法:

  • public boolean hasNext():判斷是否還有下一個元素。
  • public Object next():取得下一個元素,注意返回值爲 Object,可能需要類型轉換。如果不再有可取元素,則拋出NoSuchElementException異常。在使用該方法之前,必須先使用hasNext()方法判斷。
  • public void remove():刪除當前元素,很少用。

2、Collection接口

    該接口是Set和List的父接口,主要提供了下面的方法:

  • public boolean add(Object?o):往集合中添加新元素。添加成功,返回true,否則返回false。
  • boolean remove(Object o):從集合中刪除一個對象的引用,刪除集合中的Object元素。若刪除成功返回true,否則返回false
  • public void clear():刪除集合中的所有元素。 
  • public Iterator iterator():返回Iterator對象,這樣就可以遍歷集合中的所有元素了。
  • public boolean contains(Object?o):判斷集合中是否包含指定的元素。
  • public int size():取得集合中元素的個數。
  • Object[] toArray()   : 返回一個數組,該數組中包括集合中的所有元素
Iterator() 和toArray() 方法都用於集合的所有的元素

 Collection是最基本的集合接口,一個Collection代表一組Object,即Collection的元素(Elements)。一些Collection允許相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接繼承自Collection的類,JavaSDK提供的類都是繼承自Collection的“子接口”如List和Set。
 所有實現Collection接口的類都必須提供兩個標準的構造函數:無參數的構造函數用於創建一個空的Collection,有一個Collection參數的構造函數用於創建一個新的Collection,這個新的Collection與傳入的Collection有相同的元素。後一個構造函數允許用戶複製一個Collection。
 如何遍歷Collection中的每一個元素?不論Collection的實際類型如何,它都支持一個iterator()的方法,該方法返回一個迭代子,使用該迭代子即可逐一訪問Collection中每一個元素。典型的用法如下: 

    Iterator it = collection.iterator(); // 獲得一個迭代子
    while(it.hasNext()) {
        Object obj = it.next(); // 得到下一個元素
    }

3、Set集合

    Set是最簡單的集合,集合中的對象不按照特定的方式排序。主要有如下兩個實現:HashSet和TreeSet

3.1 HashSet

    HashSet類按照哈希算法來存取集合中的對象,具有很好的存取性能。當HashSet向集合中加入一個對象時,會調用對象的hashCode()方法獲取哈希碼,然後根據這個哈希碼進一步計算出對象在集合中的存放位置。

3.2 TreeSet

    TreeSet實現了SortedSet接口,可以對集合中的元素排序。如何排序的內容請參考其他文檔,這裏不做詳述。

 

4、List集合

List繼承自Collection接口。List是一種有序集合,List中的元素可以根據索引(順序號:元素在集合中處於的位置信息)進行取得/刪除/插入操作。
跟Set集合不同的是,List允許有重複元素。對於滿足e1.equals(e2)條件的e1與e2對象元素,可以同時存在於List集合中。當然,也有List的實現類不允許重複元素的存在。同時,List還提供一個listIterator()方法,返回一個ListIterator接口對象,和Iterator接口相比,ListIterator添加元素的添加,刪除,和設定等方法,還能向前或向後遍歷,具體的方法往下看。List接口的實現類主要有ArrayList,LinkedList,Vector,Stack等。

4.1 ArrayList類

ArrayList實現了可變大小的數組。它允許所有元素,包括null。ArrayList沒有同步。size,isEmpty,get,set方法運行時間爲常數。但是add方法開銷爲分攤的常數,添加n個元素需要O(n)的時間。其他的方法運行時間爲線性。
每個ArrayList實例都有一個容量(Capacity),即用於存儲元素的數組的大小。這個容量可隨着不斷添加新元素而自動增加,但是增長算法並沒有定義。當需要插入大量元素時,在插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率。

4.1.1 主要方法:
  • public boolean add(Object?o):添加元素
  • public void add(int index, Object element):在指定位置添加元素
  • public Iterator iterator():取得Iterator對象便於遍歷所有元素
  • public Object get(int?index):根據索引獲取指定位置的元素
  • public Object set(int index,Object element):替換掉指定位置的元素
4.1.2 排序方法:
  • Collections.sort (List list):對List的元素進行自然排序
  • Collections.sort (List list, Comparator comparator):對List中的元素進行客戶化排序 

4.2 LinkedList類

LinkedList實現了List接口,允許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。
注意LinkedList沒有同步方法。如果多個線程同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在創建List時構造一個同步的List:
List list = Collections.synchronizedList(new LinkedList(...));

5、Map

  • Map是一種把鍵對象和值對象進行映射的集合,它的每一個元素都包含一對鍵對象和值對象。
  • 向Map添加元素時,必須提供鍵對象和值對象。
  • 從Map中檢索元素時,只要給出鍵對象,就可以返回對應的值對象。
  • 鍵對象不能重複,但值對象可以重複。
  • Map有兩種常見的實現類:HashMap和TreeMap。

5.1 HashMap

HashMap按照哈希算法來存取鍵對象,有很好的存取性能。和HashSet一樣,要求當兩個鍵對象通過equals()方法比較爲true時,這兩個鍵對象的hashCode()方法返回的哈希碼也一樣。

5.2 TreeMap

TreeMap實現了SortedMap接口,能對鍵對象進行排序。同TreeSet一樣,TreeMap也支持自然排序和客戶化排序兩種方式。

5.3 方法列表

  • public Object put(Object key, Object value):插入元素
  • Object remove(Object key):   刪除與KEY相關的元素
  • void putAll(Map t):   將來自特定映像的所有元素添加給該映像
  • void clear(): 從映像中刪除所有映射
  • public Object get(Object?key):根據鍵對象獲取值對象
  • public Set keySet():取得所有鍵對象集合
  • public Collection values():取得所有值對象集合
  • public Set entrySet():取得Map.Entry對象集合,一個Map.Entry代表一個Map中的元素 

6、總結 

如果涉及到堆棧,隊列等操作,應該考慮用List,對於需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。      儘量返回接口而非實際的類型,如返回List而非ArrayList,這樣如果以後需要將ArrayList換成LinkedList時,客戶端代碼不用改變。這就是針對抽象編程。

 

7、相關內容

LinkList和ArrayList哪個更快

http://www.cnblogs.com/liqiu/archive/2013/05/06/3063926.html

不斷的向數組的中間插入數據,ArrayList和LinkedList哪個快

http://www.cnblogs.com/liqiu/archive/2013/05/07/3065203.html

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