本文首发于 cartoon 的博客
转载请注明出处:https://cartoonyu.github.io/c…
前言
就在刚刚面试,被问到了 Collections 工具类有什么功能,我懵了,很少涉及到 Collections 这个工具类,只答了对集合元素的操作以及将线程不同步的集合类转换成线程同步,下定决心复盘一下。
正文
Collections 工具类是 java.util 包中的一个工具类,主要功能是对集合及其元素进行操作。虽然被问的有点懵,在结束查看官方文档时发现其实可以分成以下几大部分
对集合本体的操作
线程同步集合的包装
-
特征
- 方法名为 synchronizedXxx
-
适用范围
- List
- Collection
- Set
- Map
-
缺点
- 每次读写都要加锁,锁的层级为对象,不利于多线程的同时操作
- 在使用 Iterator 的遍历时修改元素 ConcurrentModificationException
- 建议使用 java.util.concurrent 的集合线程同步类
返回不可变集合
-
特征
- 方法名为 emptyXxx(空集合)/singletonXxx(包含传入元素的集合)/unmodifiableXxx(包含传入集合元素的集合)
-
适用范围
-
emptyXxx
- Set
- List
- Map
- Iterator
- Enumeration
-
singletonXxx
- Set
- List
- Map
-
unmodifiableXxx
- Map
- List
- Set
-
返回指定集的动态类型安全视图
-
特征
- 方法名为 checkedXxx
-
适用范围
- List
- Map
- Queue
- Set
- Collection
集合间的转换
-
特征
- asLifoQueue(将传入的 Deque 转换成 Queue)
- list(将传入的 Enumeration 转换成 ArrayList)
- newSetFromMap(根据传入的空 Map 返回 Set)
- nCopies(根据传入的 n 返回含 n 个副本的 List)
集合内元素的操作
添加元素到集合中
-
特征
- addAll
- copy(将源集合元素复制到目标集合中)
-
适用范围
-
addAll
- Collection
-
copy
- List
-
查找元素
-
特征
- binarySearch(二分查找特定元素)
- frequency(查找元素出现次数)
- indexOfSubList(返回目标 list 在源 list 的开始位置)
- subIndexOfSubList(返回目标 list 在源 list 的结束位置)
- shuffle(返回随机索引元素)
-
适用范围
-
binarySearch
- List
-
frequency
- Collection
-
shuffle
- List
-
替换
-
特征
- fill(替换集合所有元素)
- replaceAll(替换特定的值)
-
适用范围
-
fill
- List
-
replaceAll
- List
-
改变元素位置
-
特征
- sort(排序)
- swap
- rotate(反转)
- reverse
-
适用范围
- List
对比元素
-
特征
- min/max(寻找最大 / 小元素)
- disJoint(判断两个集合元素是否全不同)
-
适用范围
- Collection
总结
Collections 工具类能对各接口以及实现类实现多种操作
-
集合类级操作
- 返回线程安全集合
- 返回不可变集合
- 返回安全视图
- 集合间的转换
-
涉及到内部元素的操作
- 添加元素到集合中
- 查找特定元素
- 替换元素
- 改变元素位置
- 元素间的比较
虽然有些方法不如其他包内的工具类好用,但是总体来说功能还是非常强大的。
这篇文章算是对官方文档的总结和归纳,也加以自己的思考,也是面试题之一,希望自己能在之后不会再吃这道题的亏。