Java中的Collection包是JDK中非常重要的一個包, 也是面試中考察的重點, 本文自頂向下的對Collection包的常用數據結構之間的關係結構到Collection包中的常用類的實現原理的知識點進行一定的整理, 供自己和大家複習使用.
Collection包的整體結構
Collection自身是一個接口, 是對集合這一概念的抽象, 提供的常用API有:
- add(Object obj) 向Collection添加元素
- remove(obj) 如果obj在集合中, 將其移除
- contains(obj) 判斷是否包含
- clear()
- size()
- isEmpty()
- iterator() 返回對集合元素的迭代器
- addAll(Collection<? extends E> c) 將一個集合的元素添加到該集合中
- containsAll(Collection<? extends E> c)
- retainAll(Collection c) 只保留集合裏面包含的
- removeIf(Predicate<? super E> filter) [這個方法很香, 不用自己迭代了]
Collection下, 有三個重要的接口分別是Set
, List
, Map
, 所代表的分別是無重複的集合, 有序集合和鍵值對集合的集合的子集. 其分別提供的API有
- Set 和Colleciton的概念最接近, 區別在於Set中無重複, API幾乎一致
- List list的特點是有序, 鏈表, 需要考慮的性能問題是是否支持隨機訪問, 增刪的時間複雜度這些, 因爲是有序的, 其API額外提供了一些和索引相關的內容
- add(index, obj) 在index位置添加
- remove(index) 刪除index位置的元素
- set(index, obj) 修改…
- get(index) 獲取index位置的對象
- indexOf(obj) list中第一個obj的下標
- Queue 隊列接口是隊列數據結構的抽象, 隊尾加, 隊首減, 提供的API有加減和查隊首元素的, 有兩套api出現異常時, 一套會拋Exception, 一套只返回null
- add(obj) & offer(obj) 在隊尾添加元素
- remove() & poll() 從隊首移除元素
- element() & peek() 獲得隊首元素但不移除
- Map 映射接口並不繼承於Colleciton, 不是廣義的Collection, 其存儲的是鍵值對, 因此API增加了對鍵和值的操作, 增刪該查也有所不同
- put(k, v) , putIfAbsent(k,v) 增和改
- replace(k, v), replace(k, ov, nv) 只能在存在時才能改
- remove(k), remove(k, v) 只有都對上才刪除
- get(k), getOrDefault(k) 查
- compute(k, function) 對鍵值對進行計算
- containsKey(k)
- containsValue(v)
- keySet()
- entrySet()
- values()
List類
JDK1.8 Collection知識點與代碼分析–ArrayList&LinkedList
Map類
JDK1.8 Collection知識點與代碼分析–HashMap
JDK1.8 Collection知識點與代碼分析–LinkedHashMap
JDK1.8 Collection知識點與代碼分析–TreeMap