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它的順序是不可知的

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

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

補充: 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())