1. 程式人生 > >淺談Java集合框架

淺談Java集合框架

順序 eem map pre 叠代器 static 支持 print ted

集合框架最大的作用就是維護一組類型同樣的對象。

僅僅是不同的類有不同的行為和性能。通常關註下面這些行為:

  • 是否能存放反復的元素
  • 遍歷的順序是如何的
  • 是否支持多線程

以下首先介紹集合的經常使用,隨後依據每種行為分別進行討論。

經常使用操作

經常使用的操作一般就是添加刪除查詢。經常使用的添加操作有add、addAll,經常使用的刪除操作有remove、removeAll。經常使用的讀取操作有contains、get、indexOf,還能夠通過叠代器進行遍歷。說這些比較抽象,以下就用代碼舉個樣例吧。


import java.util.LinkedList;


public class Main {
    public static void main(){
        LinkedList<Integer> list = new LinkedList<Integer>();
        
        // 添加三個元素
        list.add(1);
        list.add(2);
        list.add(3);
        
        // 刪除一個元素
        list.remove(2);
        
        // 輸出list中全部的元素
        for(int e:list) {
            System.out.println(e);
        }
    }
}

這個程序最後輸出的結果例如以下:

1
3

以上就是集合框架最簡單的樣例。盡管簡單,可是平時編碼的時候常常會用到。

反復值

除了Set和Map。其余的類都支持反復元素。

對於Map。針對的是它的Key,也就是說它的Key不能反復,而Value隨便怎樣取值對能夠,就不在討論範圍了。


遍歷的順序

遍歷的順序是各種集合之間最大的差別。

遍歷的順序一般有三種:依照插入順序進行遍歷、依照compareTo結果進行遍歷、無序遍歷。


依照插入順序進行遍歷的類有List、Vector、Stack、Queue、Deque、LinkedHashMap。當中Stack的遍歷順序和插入的順序是相反的。Deque是Stack和Queue合體。兩種順序都支持,並且性能更快。




依照compareTo結果進行遍歷的類有SortedMap、TreeMap、SortedSet、PriorityQueue。




無序遍歷的類有:HashMap、Set、Hashtable。


多線程

僅僅有早期版本號的集合類支持多線程,後來發現多線程不關集合框架的事,後來出現的類就都不支持多線程了。




所以。在Java的集合框架中,支持多線程的類僅僅有三個:Stack、Vector、Hashtable,這些都是早期的類,接口設計不良,性能一般,所以在新的project中一般不再使用。


除了這三個類。其它的類都不支持多線程。

假設確實須要用到多線程。能夠調用\path{Collections.synchronizedMap}或者\path {Collections.synchronizedSet}讓對象支持對線程。




算法細節

不同的類採用了不同的算法,整體上使用了鏈表、數組、哈希表、紅黑樹、堆這幾種算法。以下都是我閱讀了OpenJDK的源代碼之後總結出來的。


使用鏈表進行實現的類有:LinkedList、HashMap、Hashtable。


使用數組實現的類有:ArrayList、Deque、Stack、Vector。


使用哈希表進行實現的類有:HashMap、HashSet、Hashtable、LinkedHashMap、LinkedHashSet、WeakHashMap。


使用紅黑樹實現的類有:TreeMap。




使用堆實現的類有:PriorityQueue。

淺談Java集合框架