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