解析Collections工具类主要功能
Collections 是 JDK 提供的一个工具类,位于 java.util 包下,提供了一系列的静态方法,方便我们对集合进行各种操作,算是集合框架的一个大管家。
大致看一下方法名和参数就能知道这个方法是干嘛的:

排序操作
reverse(List list):反转顺序shuffle(List list):洗牌,将顺序打乱sort(List list):自然升序sort(List list, Comparator c):按照自定义的比较器排序swap(List list, int i, int j):将 i 和 j 位置的元素交换位置
来看例子:
List<String> list = new ArrayList<>();
list.add("seven1");
list.add("seven2");
list.add("seven3");
list.add("seven4");
list.add("seven5");
System.out.println("原始顺序:" + list);
// 反转
Collections.reverse(list);
System.out.println("反转后:" + list);
// 洗牌
Collections.shuffle(list);
System.out.println("洗牌后:" + list);
// 自然升序
Collections.sort(list);
System.out.println("自然升序后:" + list);
// 交换
Collections.swap(list, 2,4);
System.out.println("交换后:" + list);
输出后:
原始顺序:[seven1, seven2, seven3, seven4, seven5]
反转后:[seven5, seven4, seven3, seven2, seven1]
洗牌后:[seven5, seven4, seven1, seven3, seven2]
自然升序后:[seven1, seven2, seven3, seven4, seven5]
交换后:[seven1, seven2, seven5, seven4, seven3]
查找操作
binarySearch(List list, Object key):二分查找法,前提是 List 已经排序过了max(Collection coll):返回最大元素max(Collection coll, Comparator comp):根据自定义比较器,返回最大元素min(Collection coll):返回最小元素min(Collection coll, Comparator comp):根据自定义比较器,返回最小元素frequency(Collection c, Object o):返回指定对象出现的次数
来看例子:
System.out.println("最大元素:" + Collections.max(list));
System.out.println("最小元素:" + Collections.min(list));
System.out.println("出现的次数:" + Collections.frequency(list, "seven1"));
// 没有排序直接调用二分查找,结果是不确定的
System.out.println("排序前的二分查找结果:" + Collections.binarySearch(list, "seven2"));
Collections.sort(list);
// 排序后,查找结果和预期一致
System.out.println("排序后的二分查找结果:" + Collections.binarySearch(list, "seven2"));
输出后:
最大元素:seven6
最小元素:seven2
出现的次数:0
排序前的二分查找结果:-1
排序后的二分查找结果:0
填充后的结果:[seven6, seven6, seven6, seven6, seven6]
填充集合
fill(List list, Object obj):使用指定对象填充addAll(Collection<? super T> c, T... elements),往集合中添加元素
List<String> allList = new ArrayList<>();
Collections.addAll(allList, "seven","seven2","seven3");
System.out.println("addAll 后:" + allList);//addAll 后:[seven, seven2, seven3]
Collections.fill(allList, "seven666");
System.out.println("填充后的结果:" + allList);//填充后的结果:[seven666, seven666, seven666]
同步控制(不常用)
ArrayList 是线程不安全的,没法在多线程环境下使用,那 Collections 工具类中提供了多个 synchronizedXxx 方法,这些方法会返回一个同步的对象,从而解决多线程中访问集合时的安全问题。

使用起来也非常的简单:
SynchronizedList synchronizedList = Collections.synchronizedList(list);
看一眼 SynchronizedList 的源码就明白了,不过是在方法里面使用了 synchronized 关键字,加了一层锁而已。
static class SynchronizedList<E>
extends SynchronizedCollection<E>
implements List<E> {
private static final long serialVersionUID = -7754090372962971524L;
final List<E> list;
SynchronizedList(List<E> list) {
super(list); // 调用父类 SynchronizedCollection 的构造方法,传入 list
this.list = list; // 初始化成员变量 list
}
// 获取指定索引处的元素
public E get(int index) {
synchronized (mutex) {return list.get(index);} // 加锁,调用 list 的 get 方法获取元素
}
// 在指定索引处插入指定元素
public void add(int index, E element) {
synchronized (mutex) {list.add(index, element);} // 加锁,调用 list 的 add 方法插入元素
}
// 移除指定索引处的元素
public E remove(int index) {
synchronized (mutex) {return list.remove(index);} // 加锁,调用 list 的 remove 方法移除元素
}
}
那这样的话,其实效率和那些直接在方法上加 synchronized 关键字的 Vector、Hashtable 差不多(JDK 1.0 时期就有了),而这些集合类基本上已经废弃了,几乎不怎么用。正确的做法是使用并发包下的 CopyOnWriteArrayList、ConcurrentHashMap。
不可变集合(不常用)
emptyXxx():制造一个空的不可变集合singletonXxx():制造一个只有一个元素的不可变集合unmodifiableXxx():为指定集合制作一个不可变集合
举个例子:
List emptyList = Collections.emptyList();
emptyList.add("非空");
System.out.println(emptyList);
这段代码在执行的时候就抛出错误了。
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at com.itwanger.s64.Demo.main(Demo.java:61)
这是因为 Collections.emptyList() 会返回一个 Collections 的内部类 EmptyList,而 EmptyList 并没有重写父类 AbstractList 的 add(int index, E element) 方法,所以执行的时候就抛出了不支持该操作的 UnsupportedOperationException 了。
这是从分析 add 方法源码得出的原因。除此之外,emptyList 方法是 final 的,返回的 EMPTY_LIST 也是 final 的,种种迹象表明 emptyList 返回的就是不可变对象,没法进行增删改查。
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
public static final List EMPTY_LIST = new EmptyList<>();
Collections的不可变集合并不是真的不可变的,建议使用Guava的不可变集合Immutable
往期推荐
- 《SpringBoot》EasyExcel实现百万数据的导入导出
- 《SpringBoot》史上最全SpringBoot相关注解介绍
- Spring框架IoC核心详解
- 万字长文带你窥探Spring中所有的扩展点
- 如何实现一个通用的接口限流、防重、防抖机制
- 万字长文带你深入Redis底层数据结构
- volatile关键字最全原理剖析
解析Collections工具类主要功能的更多相关文章
- Java集合框架:Collections工具类
java.util.Collections工具类提供非常多实用的方法.使得程序员操作集合类的时候更加的方便easy,这些方法都是静态的. 整个Collections工具类源代码几乎相同有4000行.我 ...
- Map集合、HashMap集合、LinkedHashMap集合、Hashtable集合、Collections工具类和模拟斗地主洗牌和发牌
1.Map集合概述和特点 * A:Map接口概述 * 查看API可以知道: * 将键映射到值的对象 * 一个映射不能包含重复的键 * 每个键最多 ...
- day07(Set接口,HashSet类,hashcoad(),Collections工具类,Map集合)
Set接口 set接口的实现类特点 1.无序(取出来的顺序和存进去的数据的顺序不一致) 2.唯一(数据不能存相同的) 底层是用Map集合写的 HashSet类 实现了 set接口 唯一 ...
- Java精选笔记_集合概述(Collection接口、Collections工具类、Arrays工具类)
集合概述 集合有时又称为容器,简单地说,它是一个对象,能将具有相同性质的多个元素汇聚成一个整体.集合被用于存储.获取.操纵和传输聚合的数据. 使用集合的技巧 看到Array就是数组结构,有角标,查询速 ...
- Collections工具类、Map集合、HashMap、Hashtable(十八)
1.Map集合概述和特点 * A:Map接口概述 * 去重复, * 查看API可以知道, * 将键映射到值的对象, * 一个映射不能包含重复的键, * 每个键最多只能映射到一个值.* B:Map接口和 ...
- 用斗地主的实例学会使用java Collections工具类
目录 一.背景 二.概念 1.定义 2.方法 2.1.排序方法 2.2.查找/替换方法 三.斗地主实例 3.1.代码结构 3.2.常量定义 3.3.单只牌类 3.4.玩家类 3.5.主程序 四.深入理 ...
- JAVA Collections工具类sort()排序方法
主要分析内容: 一.Collections工具类两种sort()方法 二.示例 一.Collections工具类两种sort()方法 格式一: public static <T extends ...
- Arrays工具类和Collections工具类
集合知识点总结 Arrays工具类 .binarySearch() .sort() .fill() //填充 int[] array = new int[10]; Arrays.fill(array, ...
- java 解析excel工具类
java 解析excel工具类 CreateTime--2018年3月5日16:48:08 Author:Marydon ReadExcelUtils.java import java.io.Fi ...
- 34、Collections工具类简介
Collections工具类简介 就像数组中的Arrays工具类一样,在集合里面也有跟Arrays类似的工具类Collections package com.sutaoyu.Collections; ...
随机推荐
- EDGE浏览器提示“无法安全下载……”
EDGE浏览器升级后,下载文件时显示"无法安全下载 --"可以点击该下载后面的"-",再点击"保留",然后会弹出一个对话框,提示" ...
- 学习spring cloud记录6-初识nacos
前言 nacos已经成为了springcloud官方的插件,相对于Eureka功能更加丰富,但是Eureka并没有停止维护,Eureka2.x的并没有使用,spring还是用的1.x的版本. 安装na ...
- HK 笔试面试
考到了很多的 网络技术工程师的题目 几门没写出来 还考了一道题 pread 我不清楚 什么 意思 考了 链表的删除 会一点点 考了buff的读取 会一点点 不是基于 宏定义的 内核
- Java 中的 ==
简介 如果没有重写 equals 方法, 相当于 == 比较, 即比较两个对象的地址是否相等. 如果是基本数据类型, 直接对值进行比较. code /** * Created by lee on 20 ...
- virtual studio 未找到pdb 解决方案
参照 百度知道
- PPM 文件结构介绍
PPM 文件结构介绍 ppm 文件结构很简单分为以下几个 使用记事本打开项目即可. P3 256 256 // 表示 256 * 256 个像素 255 // RGB 每一个色彩范围是 0 - 255 ...
- vscode linux c++ 配置
简介 最官方的配置方案 https://code.visualstudio.com/docs/cpp/config-linux 有三个文件会生成 tasks.json (编译器构建设置) launch ...
- 日事清助力制造业IPD全生命周期管理:从开发流程到持续优化的跨部门协作实践
一.先聊聊IPD,它到底是什么 在竞争激烈的市场中,产品的快速.精准开发是企业致胜的关键.而为了确保新产品能够顺利从概念到落地,越来越多的企业采用集成产品开发(IPD, Integrated Prod ...
- MinIO数据导出
最近公司里需要将生产环境MinIO数据导出来一份,用于后续工作.导出的过程中尝试了三种方法(最终选择了方法三),内容如下: 方法一:MinIO Web控制台界面下载(适用于少量文件) 通过浏览器访问M ...
- 使用ETL进行数据接入的方式
数据接入 数据接入,作为现代信息技术架构中的一个关键环节,指的是将来自不同源头的数据整合到统一的数据平台或系统中.这一过程不仅是技术上的挑战,也涉及到组织结构.业务流程等多个层面的协调与优化.通过有效 ...