Java集合工具包位于Java.util包下建丧,包含了很多常用的數(shù)據(jù)結(jié)構(gòu)排龄,如數(shù)組、鏈表翎朱、棧橄维、隊列、集合拴曲、哈希表等争舞。學(xué)習(xí)Java集合框架下大致可以分為如下五個部分:List列表、Set集合澈灼、Map映射竞川、迭代器(Iterator、Enumeration)叁熔、工具類(Arrays委乌、Collections)。
Java集合類的整體框架如下:
ArrayList
- 結(jié)構(gòu):基于數(shù)組實現(xiàn)荣回,是一個動態(tài)數(shù)組福澡,其容量能自動增長
- 特點:
- ArrayList基于數(shù)組實現(xiàn),可以通過下標(biāo)索引直接查找到指定位置的元素驹马,因此查找效率高革砸,但每次插入或刪除元素除秀,就要大量地移動元素,插入刪除元素的效率低算利。
- ArrayList中允許元素為null册踩。
- ArrayList的實現(xiàn)中大量地調(diào)用了Arrays.copyof()和System.arraycopy()方法。
- 是非線程安全的效拭,只在單線程下適合使用暂吉。
LinkedList
-
結(jié)構(gòu):基于雙向循環(huán)鏈表實現(xiàn)的
- 特點
- LinkedList是基于鏈表實現(xiàn)的,因此不存在容量不足的問題缎患,所以這里沒有擴容的方法慕的。
- LinkedList中允許元素為null。
- inkedList是基于鏈表實現(xiàn)的挤渔,因此插入刪除效率高肮街,查找效率低(雖然有一個加速動作)。
- 是非線程安全的判导,只在單線程下適合使用嫉父。
HashMap
-
結(jié)構(gòu): 基于哈希表實現(xiàn)的,每一個元素都是一個key-value對眼刃,其內(nèi)部通過單鏈表解決沖突問題绕辖,容量不足(超過了閾值)時,同樣會自動增長擂红。
- 特點:
- 初始容量和加載因子是影響HashMap性能的重要參數(shù)仪际,當(dāng)哈希表中的條目數(shù)超出了加載因子與當(dāng)前容量的乘積時,則要對該哈希表進行 resize 操作(即擴容)昵骤。
- HashMap中key和value都允許為null树碱。
- 無論我們指定的容量為多少,構(gòu)造方法都會將實際容量設(shè)為不小于指定容量的2的次方的一個數(shù)涉茧,且最大值不能超過2的30次方
- 計算key的hash值用"&"運算
- 非線程安全的赴恨,只是用于單線程環(huán)境下
HashTable
- 結(jié)構(gòu):同樣是基于哈希表實現(xiàn)的,同樣每個元素都是key-value對伴栓,其內(nèi)部也是通過單鏈表解決沖突問題伦连,容量不足(超過了閾值)時,同樣會自動增長钳垮。
- 特點:
- 是線程安全的惑淳,能用于多線程環(huán)境中。
- Hashtable中key和value都不允許為null
- Hashtable不要求底層數(shù)組的容量一定要為2的整數(shù)次冪
- Hashtable在求hash值對應(yīng)的位置索引時饺窿,用取模運算
- 與HashMap存儲結(jié)構(gòu)和解決沖突的方法都是相同的歧焦。
HashSet
- 結(jié)構(gòu):基于HashMap實現(xiàn)
- 特點:
- 它不允許出現(xiàn)重復(fù)元素
- 不保證集合中元素的順序
- 允許包含值為null的元素,但最多只能有一個null元素。
- 非線程安全的绢馍,只是用于單線程環(huán)境下
TreeMap
-
結(jié)構(gòu):是一個有序的key-value集合向瓷,它是通過紅黑樹實現(xiàn)的
-
特點:
- 存儲的數(shù)據(jù)是有序的
- 允許包含鍵為null
- 鍵值不允許重復(fù)
- 非線程安全的,只是用于單線程環(huán)境下
TreeSet
- 結(jié)構(gòu):基于TreeMap實現(xiàn)
- 特點:與TreeMap類似舰涌,與之不同的是提供有序的Set集合