Java集合基礎知識

Java集合框架基礎:算法

 

Collection爲集合層級的根接口,集合中包含一組對象。數組

Set是一個不能包含重複元素的集合;List是一個有序集合,能夠包含重複元素;數據結構

Map是一種key-value結構的集合模型,不能包含重複的key值,每一個key只能映射到一個value。多線程

 

HashMap和HashTable的不一樣:框架

a. HashMap容許key和value爲null, 而HashTable不容許工具

b. HashTable是線程同步的,而HashMap不是。所以HashMap適合單線程環境,HashTable適合多線程環境(具體應用要根據場景需求,而不是誰適合誰不適合,在不須要線程同步限制的時候推薦使用HashMap,能夠提升程序運行的效率)性能

c. LinkedHashMap是HashMap的一個子類,如需遍歷順序,能夠很方便的從HashMap轉向LinkedHashMap,而HashTable它的順序是不可知的spa

d. HashMap提供退key的Set進行遍歷,所以它是fail-fast的,單HashTable提供對key的Enumeration進行遍歷,不支持fail-fast線程

e. HashTable被認爲是個遺留的類,若是你尋求在迭代的時候修改Map,你應該使用CocurrentHashMap3d

補充: HashMap能夠經過Map m = Collections.synchronizedMap(hashMap)來達到同步的效果。

 

HashMap仍是TreeMap:

a. HashMap的內部結構是一個數組,線性順序存儲,二次結構使用線性的單鏈表。 使用key的hash code作二次hash以後,在截取小於數組長度的值爲索引。 

b. HashMap是一個經常使用的Map,它根據鍵的hashcode值存儲數據,根據key能夠快速獲取value,具備很快的訪問速度。只容許一個key值爲null,不支持線程同步,若是須要同步可使用Collections的synchronizedMap方法實現

c. TreeMap其內部數據結構是一棵紅黑樹,使用鏈式存儲,能夠指定比較器Comparator, key需實現Comparable接口。key值不能爲null。存節點性能稍差,由於須要調整樹結構;取節點用的鏈表遍歷,可是屬於有序比較,性能中等。

 

ArrayList和Vector的相同與不一樣:

a. 二者都是基於索引的,基於數組來實現的

b. 二者都維護插入的順序,能夠根據插入順序來獲取元素

c. 二者的迭代器都是fail-fast

(fail-fast機制是Java集合Collection中的一種錯誤機制,當多個線程對同一個集合的內容進行操做時就可能產生fail-fast事件。例如線程A經過iterator去遍歷某集合的過程當中,若該集合的內容被其餘線程更改了,那麼線程A訪問集合時就會拋出 CocurrentModificationException,產生fail-fast事件)

d. 二者都容許null值,能夠利用索引對元素進行隨機的訪問

e. Vector是同步的,而ArrayList不是。若是你尋求在迭代時對列表進行改變,你應該使用CopyOnWriteArrayList

f. ArrayList更加通用,可使用Collections工具類輕易的獲取同步列表和只讀列表

 

ArrayList和LinkedList異同:

a. 二者都是List接口的具體實現,ArrayList基於動態數組,LinkedList基於鏈表的數據結構

b. ArrayList是基於Array實現,一個基於索引的數據結構,因此它能夠對元素進行隨機訪問,複雜度爲O(1)。LinkedList存儲一些列的節點數據,每一個節點都與前一個和下一個節點相連。因此儘管有使用索引來獲取元素的方法,其內部實現是從起點開始遍歷,遍歷到因此的節點後返回元素,時間複雜度爲O(n), 比ArrayList要慢

c. 與ArrayList相比,在LinkedList中插入、刪除一個元素會更快,由於在插入或刪除一個元素的時候ArrayList須要更新每一個元素的索引(插入不表明在最後添加新元素),並改變數組的大小, 而LinkedList僅僅須要在更新插入位置先後兩個元素的節點信息

d. LinkedList須要消耗更多的內存,由於它須要同時存儲每一個節點先後節點的引用

補充:LinkedList實現了List接口,容許null值。此外它還提供額外的get/remove/insert方法在LinkedList的首部或尾部。這些操做可使LinkedList被用做堆棧(stack)/ 隊列(queue)或雙向隊列 (queue)。 LinkedList沒有同步方法,若是多個線程同事訪問一個list則必須實現訪問同步, 經過: List list = Collections.synchronizedList(new LinkedList(...)) 實現

 

Array與ArrayList異同:

a. Array能夠包含基本數據類型或對象類型,ArrayList只能包含對象類型

b. Array的大小固定,ArrayList的大小是動態變化的,一次默認增長原大小的0.5倍

c. ArrayList提供了更多的方法和特性

 

Collections類解析:

Java.util.Collections是一個工具類,僅包含靜態方法,它們操做或返回集合。包含操做集合的多態算法,返回一個由指定集合支持的新集合和其餘一些內容。包含集合框架算法的方法,好比折半搜索、排序、混編和逆序等

 

Comparator與Comparable接口:

 二者的做用是對自定義的Class進行大小比較

例如: public class Man{public String name; public int age;}, 實例化後獲得包含 man1, man2, man3的manList。咱們用 Collections.sort(manList),得不到咱們預期排序的結果。可是若是是一個包含的字符串的listStr,經過調用 Collections.sort(listStr) 是能夠獲得正確的排序,主要是由於 String 已經實現了 Comparable 接口。 所以 Man 也須要實現一個比較器才能進行manList的排序。

Comparable 是定義在 Man 類的內部: public class Man implements Comparable {...},集成 Comparable,實現 compareTo 方法

Comparator 是定義在 Man 外部的, Man 類自己不須要有任何變化,可是咱們須要另外定義一個比較器: public ManComparator implements Comparator {...}

  在 ManComparator 內部實現了怎麼比較兩個 Man 的大小,在對一個 manList 進行排序的時候: Collections.sort(manList, new ManComparator())

相關文章
相關標籤/搜索