Collections 工具类

在 Java 编程中,集合(Collections)是处理数据的核心工具之一。为了简化集合操作并提高代码的可读性和可维护性,JDK 提供了一个强大的工具类:java.util.Collections。这个类包含了一系列静态方法,用于对集合进行各种操作,如排序、查找、同步控制、创建不可变集合等。

1 引入 Collections 类

Collections 类位于 java.util 包中,因此在使用之前需要导入:

import java.util.Collections;

2 排序操作

Collections 类提供了多种排序方法,可以对集合进行反转、洗牌、自然排序和自定义排序等操作。

  • reverse(List list):反转集合中元素的顺序。
  • shuffle(List list):随机打乱集合中元素的顺序。
  • sort(List list):对集合进行自然升序排序。
  • sort(List list, Comparator c):根据自定义比较器对集合进行排序。
  • swap(List list, int i, int j):交换集合中指定位置的两个元素。

示例代码

List<String> list = new ArrayList<>();
list.add("沉默王二");
list.add("沉默王三");
list.add("沉默王四");
list.add("沉默王五");
list.add("沉默王六");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);

输出结果

原始顺序:[沉默王二, 沉默王三, 沉默王四, 沉默王五, 沉默王六]
反转后:[沉默王六, 沉默王五, 沉默王四, 沉默王三, 沉默王二]
洗牌后:[沉默王五, 沉默王二, 沉默王六, 沉默王三, 沉默王四]
自然升序后:[沉默王三, 沉默王二, 沉默王五, 沉默王六, 沉默王四]
交换后:[沉默王三, 沉默王二, 沉默王四, 沉默王六, 沉默王五]

3 查找操作

Collections 类提供了多种查找方法,可以用于查找集合中的最大值、最小值、元素出现的次数等。

  • binarySearch(List list, Object key):二分查找法,前提是集合已经排序。
  • max(Collection coll):返回集合中的最大元素。
  • max(Collection coll, Comparator comp):根据自定义比较器返回集合中的最大元素。
  • min(Collection coll):返回集合中的最小元素。
  • min(Collection coll, Comparator comp):根据自定义比较器返回集合中的最小元素。
  • fill(List list, Object obj):使用指定对象填充集合。
  • frequency(Collection c, Object o):返回指定对象在集合中出现的次数。

示例代码:

System.out.println("最大元素:" + Collections.max(list));
System.out.println("最小元素:" + Collections.min(list));
System.out.println("出现的次数:" + Collections.frequency(list, "沉默王二"));// 没有排序直接调用二分查找,结果是不确定的
System.out.println("排序前的二分查找结果:" + Collections.binarySearch(list, "沉默王二"));
Collections.sort(list);
// 排序后,查找结果和预期一致
System.out.println("排序后的二分查找结果:" + Collections.binarySearch(list, "沉默王二"));Collections.fill(list, "沉默王八");
System.out.println("填充后的结果:" + list);

输出结果:

最大元素:沉默王四
最小元素:沉默王三
出现的次数:1
排序前的二分查找结果:0
排序后的二分查找结果:1
填充后的结果:[沉默王八, 沉默王八, 沉默王八, 沉默王八, 沉默王八]

4 同步控制

在多线程环境下,集合操作可能会引发线程安全问题。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 的构造方法,传入 listthis.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 关键字的 VectorHashtable 差不多(JDK 1.0 时期就有了),而这些集合类基本上已经废弃了,几乎不怎么用。

public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{// 获取指定索引处的元素public synchronized E get(int index) {if (index >= elementCount) // 如果索引超出了列表的大小,则抛出数组下标越界异常throw new ArrayIndexOutOfBoundsException(index);return elementData(index); // 返回指定索引处的元素}// 移除指定索引处的元素public synchronized E remove(int index) {modCount++; // 修改计数器,标识列表已被修改if (index >= elementCount) // 如果索引超出了列表的大小,则抛出数组下标越界异常throw new ArrayIndexOutOfBoundsException(index);E oldValue = elementData(index); // 获取指定索引处的元素int numMoved = elementCount - index - 1; // 计算需要移动的元素个数if (numMoved > 0) // 如果需要移动元素System.arraycopy(elementData, index+1, elementData, index,numMoved); // 将数组中的元素向左移动一位elementData[--elementCount] = null; // 将最后一个元素设置为 null,等待垃圾回收return oldValue; // 返回被移除的元素}
}

正确的做法是使用并发包下的 CopyOnWriteArrayListConcurrentHashMap

5 不可变集合

Collections 类提供了多种方法来创建不可变集合,这些集合一旦创建,就无法进行修改操作。

  • emptyXxx():创建一个空的不可变集合。
  • singletonXxx():创建一个只包含一个元素的不可变集合。
  • unmodifiableXxx():为指定集合创建一个不可变视图。

示例代码:

List emptyList = Collections.emptyList();
emptyList.add("非空");  // 抛出 UnsupportedOperationException
System.out.println(emptyList);

输出结果:

Exception in thread "main" java.lang.UnsupportedOperationExceptionat java.util.AbstractList.add(AbstractList.java:148)at java.util.AbstractList.add(AbstractList.java:108)at com.itwanger.s64.Demo.main(Demo.java:61)

6 其他操作

Collections 类还提供了一些其他常用的方法:

  • addAll(Collection<? super T> c, T... elements):将多个元素添加到集合中。
  • disjoint(Collection<?> c1, Collection<?> c2):判断两个集合是否没有交集。

示例代码:

List<String> allList = new ArrayList<>();
Collections.addAll(allList, "沉默王九", "沉默王十", "沉默王二");
System.out.println("addAll 后:" + allList);System.out.println("是否没有交集:" + (Collections.disjoint(list, allList) ? "是" : "否"));

输出结果:

addAll 后:[沉默王九, 沉默王十, 沉默王二]
是否没有交集:否

7 CollectionUtils:Spring 和 Apache 的集合工具类

除了 JDK 提供的 Collections 工具类,Spring 和 Apache 也提供了各自的集合工具类,如 org.springframework.util.CollectionUtilsorg.apache.commons.collections.CollectionUtils

Apache 的 CollectionUtils 提供了更多实用的方法,如集合判空、集合操作(交集、并集、差集等)。

Maven 坐标:

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version>
</dependency>

示例代码:

List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);List<Integer> list2 = new ArrayList<>();
list2.add(2);
list2.add(4);// 获取并集
Collection<Integer> unionList = CollectionUtils.union(list, list2);
System.out.println(unionList);// 获取交集
Collection<Integer> intersectionList = CollectionUtils.intersection(list, list2);
System.out.println(intersectionList);// 获取交集的补集
Collection<Integer> disjunctionList = CollectionUtils.disjunction(list, list2);
System.out.println(disjunctionList);// 获取差集
Collection<Integer> subtractList = CollectionUtils.subtract(list, list2);
System.out.println(subtractList);

输出结果:

[1, 2, 3, 4]
[2]
[1, 3, 4]
[1, 3]

8 小结

Collections 工具类作为集合框架的大管家,提供了丰富的静态方法,帮助开发者简化集合操作,提高代码的可读性和可维护性。掌握这些方法,可以显著提升编程效率,减少出错的可能性。

虽然 Collections 工具类非常强大,但更重要的是理解其背后的设计思想和实现原理。通过阅读源码,学习 JDK 设计者的编程技巧,可以进一步提升自己的编码水平。

在实际工作中,合理利用 Collections 工具类和第三方工具类(如 Apache 的 CollectionUtils),可以大大简化集合操作,提高代码质量。

9 思维导图

在这里插入图片描述

10 参考链接

Java Collections:专为集合框架而生的工具类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/14242.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习引领流体动力学新纪元:CFD、Fluent与OpenFOAM的深度融合

在科技日新月异的今天&#xff0c;机器学习正以前所未有的力量重塑着众多学科领域&#xff0c;其中&#xff0c;流体动力学便是受益匪浅的典范。作为计算流体力学&#xff08;CFD&#xff09;领域的两大巨头&#xff0c;Fluent与OpenFOAM正携手机器学习技术&#xff0c;共同开启…

django入门【05】模型介绍(二)——字段选项

文章目录 1、null 和 blank示例说明⭐ null 和 blank 结合使用的几种情况总结&#xff1a; 2、choices**choices 在 Django 中有以下几种形式&#xff1a;**&#xff08;1&#xff09; **简单的列表或元组形式**&#xff08;2&#xff09; **字典映射形式**&#xff08;3&#…

PL/SQL执行.sql文件

1.编写.sql文件&#xff0c;创建update.sql文件&#xff0c;文件如下&#xff1a; set feedback offset define off--更新表中所有人的年龄update a set age18;prompt Done. 2.打开plsql选择命令窗口&#xff0c;即选择File->New->Command Window&#xff1b; 打开后的…

论文5—《基于改进YOLOv5s的轻量化金银花识别方法》文献阅读分析报告

论文报告&#xff1a;基于改进YOLOv5s的轻量化金银花识别方法 论文报告文档 基于改进YOLOv5s的轻量化金银花识别方法 论文报告文档摘要国内外研究现状国内研究现状国外研究现状 研究目的研究问题使用的研究方法试验研究结果文献结论创新点和对现有研究的贡献1. 目标检测技术2. …

【数据结构】ArrayList与LinkedList详解!!!——Java

目录 一&#x1f31e;、List 1&#x1f345;.什么是List&#xff1f; 2&#x1f345;.List中的常用方法 二&#x1f31e;、ArrayList 1&#x1f34d;.什么是ArrayList? 2&#x1f34d;.ArrayList的实例化 3&#x1f34d;.ArrayList的使用 4&#x1f34d;.ArrayList的遍…

modbus协议 Mthings模拟器使用

进制转换 HEX 16进制 (0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F表示0-15) dec 10进制 n(16进制) -> 10 abcd.efg(n) d*n^0 c*n^1 b*n^2 a*n^3 e*n^-1 f*n^-2 g*n^-3&#xff08;10&#xff09; 10 -> n(16进制) Modbus基础概念 高位为NUM_H&…

微信版产品目录如何制作?

微信作为我国最流行的社交媒体平台&#xff0c;拥有庞大的用户群体。许多企业都希望通过微信来推广自己的产品&#xff0c;提高品牌知名度。制作一份精美、实用的微信版产品目录&#xff0c;是企业微信营销的重要手段。微信版产品目录的制作方法&#xff0c;帮助您轻松入门。 ​…

消息推送之SSE

一、简介 市面上很多系统都有 以上三种的消息提醒。但大多分为2类&#xff0c;一类移动端&#xff0c;一类web端比&#xff0c;通常在服务端会有若干张消息推送表&#xff0c;用来记录用户触发不同事件所推送不同类型的消息&#xff0c;前端主动查询&#xff08;拉&#x…

react中如何在一张图片上加一个灰色蒙层,并添加事件?

最终效果&#xff1a; 实现原理&#xff1a; 移动到图片上的时候&#xff0c;给img加一个伪类 &#xff01;&#xff01;此时就要地方要注意了&#xff0c;因为img标签是闭合的标签&#xff0c;无法直接添加 伪类&#xff08;::after&#xff09;&#xff0c;所以 我是在img外…

微搭低代码入门03函数

目录 1 函数的定义与调用2 参数与返回值3 默认参数4 将功能拆分成小函数5 函数表达式6 箭头函数7 低代码中的函数总结 在用低代码开发软件的时候&#xff0c;除了我们上两节介绍的变量、条件语句外&#xff0c;还有一个重要的概念叫函数。函数是执行特定功能的代码片段&#xf…

Zabbix中文监控指标数据乱码

1&#xff09;点击主机&#xff0c;选择Zabbix server 中的 图形 一项&#xff0c;可以看到当前显示的为乱码 2&#xff09; 下载字体文件&#xff1a; https://gitcode.com/open-source-toolkit/4a3db/blob/main/SimHei.zip 解压unzip -x SimHei.zip 3&#xff09; 替换字体文…

限价订单簿中的高频交易

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

JDBC事务管理、四大特征(ACID)、事务提交与回滚、MySQL事务管理

目录 一、什么是JDBC事务&#xff1f; &#xff08;1&#xff09;事务概念。 &#xff08;2&#xff09;JDBC事务的实现。 1、提交。 2、回滚。 &#xff08;3&#xff09;生活中可以类比 JDBC 事务的例子。 1、以网上购物为例。 二、JDBC的四大事务&#xff08;ACID&#xff0…

操作系统离散存储练习题

1. (简答题)分页存储管理系统具有快表&#xff0c;内存访问时间为2ns&#xff0c;检索快表时间为0.5ns&#xff0c;快表命中率为80%&#xff0c;求有效访问时间 -分析&#xff1a;首先访问缓存&#xff08;快表&#xff09;&#xff0c;如果没有找到访问内存&#xff08;页表&…

【AI日报】2024年11月13号

我回来啦&#xff01;&#xff01;发现自己好久不发文章了。 在某头部AI公众号实习的过程中&#xff0c;学到太多太多了&#xff0c;也感谢某位大神的指点&#xff0c;也衷心祝愿他的IP可以越做越好 之后因为时间关系&#xff0c;可能要自己出来单干了。 在实习过程中学到的…

inline内联函数(C++)

a&#xff09;⽤inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调⽤的地⽅展开内联函数&#xff0c;这样调⽤内联函数就不需要建⽴栈帧了&#xff0c;就可以提⾼效率。 b&#xff09;inline对于编译器⽽⾔只是⼀个建议&#xff0c;也就是说&#xff0c;你加了inl…

C++builder中的人工智能(27):如何将 GPT-3 API 集成到 C++ 中

人工智能软件和硬件技术正在迅速发展。我们每天都能看到新的进步。其中一个巨大的飞跃是我们拥有更多基于自然语言处理&#xff08;NLP&#xff09;和深度学习&#xff08;DL&#xff09;机制的逻辑性更强的AI聊天应用。有许多AI工具可以用来开发由C、C、Delphi、Python等编程语…

Harmony- List组件最后一个item显示不全

在使用List组件显示数据的时候会出现最后一个item显示不全的问题&#xff0c;如下 出现在高度问题上&#xff0c;如果List组件上下没有其他占位组件就是正常显示的 解决方案&#xff1a; 1.给List组件加上layoutWeight(1)&#xff0c;使它填满父控件剩余空间; 2.还有一种情况…

neo4j desktop基本入门

下载安装不在赘述&#xff0c;本文只记述一些neo4j的基本入门操作 连接本地neo4j数据库 1. 点击ADD添加连接 端口一般是7687 账户名和密码忘记了&#xff0c;可以通过neo4j web&#xff08;默认为neo4jneo4j://localhost:7687/neo4j - Neo4j Browser&#xff09;重置密码 AL…

function and task

任务和函数 在Verilog语言中提供了任务和函数&#xff0c;可以将较大的行为级设计划分为较小的代码段&#xff0c;允许设计者将需要在多个地方重复使用的相同代码提取出来&#xff0c;编写成任务和函数&#xff0c;这样可以使代码更加简洁和易懂。 1.1任务 任务的定义 任务定义…