數據結構(集合和數組)

在使用JAVA的時候常常用到集合類(有時也稱容器類),下面對經常使用的容器類進行一下總結。首先看一張圖,瞭解一下集合類的結構以及他們之間的關係:html

1、Collection接口

    Collection接口是 Set List 和 Queue 接口的父接口,提供了多數集合經常使用的方法聲明,包括 add()remove()contains() size() iterator() 等。java

    其中各個方法的具體用法就再也不一一介紹了。算法

2、幾個比較重要的接口和類的介紹

1List接口數組

    List 關心的是索引,與其餘集合相比,List特有的就是和索引相關的一些方法:get(int index) 、 add(int index,Object o) 、 indexOf(Object o) List是有序的Collection,使用此接口可以精確的控制每一個元素插入的位置。用戶可以使用索引(元素在List中的位置,相似於數組下標)來訪問List中的元素,這相似於Java的數組;另外List容許有相同的元素。安全

    ArrayList 能夠將它理解成一個可增加的數組,它提供快速迭代和快速隨機訪問的能力,其底層使用數組實現的,查詢效率較高,可是增刪效率低且是線程不安全的。性能

    LinkedList 中的元素之間是雙連接的,當須要快速插入和刪除時LinkedList成爲List中的不二選擇,其底層使用雙向循環鏈表實現,查詢效率低,但增刪元素效率比較高。ui

    Vector ArrayList的線程安全版本,性能比ArrayList要低,如今已經不多使用。spa

2Set接口.net

    Set關心惟一性,它不容許重複。線程

    HashSet 當不但願集合中有重複值,而且不關心元素之間的順序時可使用此類,使用哈希算法實現。

    LinkedHashset 當不但願集合中有重複值,而且但願按照元素的插入順序進行迭代遍歷時可採用此類。

    TreeSet 當不但願集合中有重複值,而且但願按照元素的天然順序進行排序時能夠採用此類。(天然順序意思是某種和插入順序無關,而是和元素自己的內容和特質有關的排序方式,譬如「abc」排在「abd」前面。)

3Queue接口

    Queue用於保存將要執行的任務列表。

    LinkedList 一樣實現了Queue接口,能夠實現先進先出的隊列。

    PriorityQueue 用來建立天然排序的優先級隊列。

4Map接口

    Map關心的是惟一的標識符。他將惟一的鍵映射到某個元素。固然鍵和值都是對象。

    HashMap 當須要鍵值對錶示,又不關心順序時可採用HashMap,線程不安全,容許keyvalueNULL

    Hashtable 注意Hashtable中的t是小寫的,它是HashMap的線程安全版本,不容許keyvalueNULL

    LinkedHashMap 當須要鍵值對,而且關心插入順序時可採用它。

    TreeMap 當須要鍵值對,並關心元素的天然排序時可採用它。

 注:相關連接

.Java經常使用集合比較及使用場景

1.List類和Set
 List類和Set類是Collection集合接口的子接口。
 Set子接口:無序,不容許重複。
 List子接口:有序,能夠有重複元素。

 SetList對比: 
 Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引發元素位置改變。 
 List:和數組相似,List能夠動態增加,查找元素效率高,插入刪除元素效率低,由於會引發其餘元素位置改變。 

 SetList具體子類: 
 Set 
 |————HashSet:以哈希表的形式存放元素,插入刪除速度很快。 

 List 
 |————ArrayList:動態數組 
 |————LinkedList:鏈表、隊列、堆棧。

 Arrayjava.util.Vector 
 Vector是一種老的動態數組,是線程同步的,效率很低,通常不同意使用。

 2.HashMapHashTable
 a.HashMap去掉了HashTablecontains方法,可是加上了containsValue()containsKey()方法。
 b.HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。
 c.HashMap容許空鍵值,而HashTable不容許。

3.線程安全集合類與非線程安全集合類 
 LinkedListArrayListHashSet是非線程安全的,Vector是線程安全的;
 HashMap是非線程安全的,HashTable是線程安全的;
 StringBuilder是非線程安全的,StringBuffer是線程安全的。

4.集合適用場景
 對於查找和刪除較爲頻繁,且元素數量較多的應用,SetMap是更好的選擇
 ArrayList適用於經過爲位置來讀取元素的場景
 LinkedList 適用於要頭尾操做或插入指定位置的場景
 Vector 適用於要線程安全的ArrayList的場景
 Stack 適用於線程安全的LIFO場景
 HashSet 適用於對排序沒有要求的非重複元素的存放
 TreeSet 適用於要排序的非重複元素的存放
 HashMap 適用於大部分key-value的存取場景
 TreeMap 適用於需排序存放的key-value場景

注:相關連接

相關文章
相關標籤/搜索