Wend看源码-Java-Collections 工具集学习

摘要   

  java.util.Collections它提供了一系列静态方法,用于对集合(如ListSetMap等)进行操作。这些操作包括排序、查找、替换、同步等多种功能,帮助开发者更方便地处理集合数据。以下是Collections 提供的一些主要方法的总结。

sort

        对指定的 List 进行自然排序(元素需实现 Comparable 接口)。或根据指定的 Comparator 实现来对 List 进行排序,通过自定义 Comparator 可以灵活地定义排序规则,比如实现降序排序或者按照特定业务逻辑排序等。

示例代码

 // 示例1 :使用 sort 对列表进行排序private static void sortList(){// 创建一个整数列表List<Integer> numberList = new ArrayList<>();numberList.add(5);numberList.add(3);numberList.add(8);numberList.add(1);// 1. 使用sort方法进行自然排序(升序)List<Integer> sortedList = new ArrayList<>(numberList);Collections.sort(sortedList);System.out.println("升序排序后的列表: " + sortedList);// 2. 使用自定义Comparator进行降序排序Comparator<Integer> reverseComparator = (a, b) -> b - a;Collections.sort(numberList, reverseComparator);System.out.println("降序排序后的列表: " + numberList);}

binarySearch

        二分查找。在已排序(升序)的 List 中使用二分查找算法查找指定元素 key,返回元素在列表中的索引,如果不存在则返回一个特定的负数表示插入点。

示例代码

// 示例2 :查找元素(二分查找,要求列表已排序)private static void binarySearch() {// 创建一个整数列表List<Integer> sortedList = new ArrayList<>();sortedList.add(1);sortedList.add(2);sortedList.add(3);sortedList.add(4);sortedList.add(5);// 3. 查找元素(二分查找,要求列表已排序)int index = Collections.binarySearch(sortedList, 3);System.out.println("元素3在升序排序后的列表中的索引: " + index);}

reverse

        反转指定 List 中元素的顺序。

示例代码

 // 示例3 :反转列表元素顺序private static void reverseList() {// 创建一个整数列表List<Integer> sortedList = new ArrayList<>();sortedList.add(1);sortedList.add(2);sortedList.add(3);sortedList.add(4);sortedList.add(5);// 4. 反转列表元素顺序Collections.reverse(sortedList);System.out.println("反转后的列表: " + sortedList);}

fill

        用指定的对象 obj 填充整个 List,也就是将列表中的所有元素都设置为 obj

示例代码

 // 示例4 :填充列表private static void fillList() {// 创建一个字符串列表List<String> stringList = new ArrayList<>();stringList.add("old");Collections.fill(stringList, "new");System.out.println("填充后的字符串列表: " + stringList);}

max(最大值)

        根据元素的自然顺序返回集合中的最大元素(元素需实现 Comparable 接口)。或依据指定的 Comparator 返回集合中的最大元素。

min(最小值)

        根据元素的自然顺序返回集合中的最小元素(元素需实现 Comparable 接口)。或依据指定的 Comparator 返回集合中的最小元素。

示例代码

 // 示例5 :获取最大值和最小值(自然顺序)private static void getMaxAndMin() {List<Integer> numberList = new ArrayList<>();numberList.add(10);numberList.add(20);numberList.add(5);System.out.println("最大值(自然顺序): " + Collections.max(numberList));System.out.println("最小值(自然顺序): " + Collections.min(numberList));}

unmodifiableList(不可变集合)

        返回指定 List 的不可变视图,对该视图进行修改操作会抛出 UnsupportedOperationException,可用于保护原始列表不被意外修改。类似的还有 unmodifiableSetunmodifiableMap 等针对 Set 和 Map 类型创建不可变视图的方法。

示例代码

 // 示例6 :创建不可变列表视图示例private static void createImmutableList() {List<Integer> sortedList = new ArrayList<>();sortedList.add(1);sortedList.add(2);sortedList.add(3);sortedList.add(4);sortedList.add(5);// 创建不可变列表视图示例List<Integer> immutableList = Collections.unmodifiableList(sortedList);// 下面这行代码会抛出UnsupportedOperationException异常,因为不可变视图不允许修改// immutableList.add(99);// 不可变的Set、MapSet<Integer> immutableSet = Collections.unmodifiableSet(new HashSet<>(sortedList));Map<Integer, String> immutableMap = Collections.unmodifiableMap(new HashMap<>());}

synchronizedList(同步集合)

        返回指定 List 的线程安全的同步包装版本,适用于多线程环境下对列表的操作,避免并发修改异常等问题。同样也有针对 Set 和 Map 的同步包装方法如 synchronizedSetsynchronizedMap

示例代码

 // 示例7 :使用 synchronizedList 创建线程安全的列表private static void synchronizedList() {List<Integer> sortedList = new ArrayList<>();sortedList.add(1);sortedList.add(2);sortedList.add(3);sortedList.add(4);sortedList.add(5);// 创建线程安全的列表List<Integer> synchronizedList = Collections.synchronizedList(sortedList);// 通过synchronizedList获取的列表是线程安全的,但是需要注意的是,对列表的迭代操作仍然需要手动同步synchronized (synchronizedList) {for (Integer num : synchronizedList) {System.out.println(num);}}}

copy(拷贝)

        将 src 列表中的元素拷贝到 dest 列表中,要求 dest 列表要有足够的空间(通常先创建一个合适大小的目标列表)

nCopies(创建不可变列表并填充指定元素)

        它用于创建一个不可变的List,其中包含指定数量(n)的指定对象(o)。

示例代码

 // 示例8 :使用 nCopies 创建指定大小的列表,并填充指定元素,使用copy复制一个Listprivate static void Copy() {List<Integer> sortedList = new ArrayList<>();sortedList.add(1);sortedList.add(2);sortedList.add(3);sortedList.add(4);sortedList.add(5);// 创建一个包含10个元素的列表,每个元素都是0List<Integer> copyList = new ArrayList<>(Collections.nCopies(10, 0));System.out.println("创建的列表: " + copyList);Collections.copy(copyList, sortedList);System.out.println("拷贝后: copyList: " + copyList);}

shuffle(重新洗牌)

        用于对指定的List进行随机重排(洗牌操作),使得列表中的元素顺序被打乱,并且所有可能的排列出现的概率大致相等。

示例代码

 // 示例9 :使用 shuffle 对列表进行洗牌private static void shuffleList() {List<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);Collections.shuffle(arrayList);System.out.println("Shuffled ArrayList: " + arrayList);List<Integer> linkedList = new LinkedList<>();linkedList.add(5);linkedList.add(6);linkedList.add(7);linkedList.add(8);Collections.shuffle(linkedList);System.out.println("Shuffled LinkedList: " + linkedList);}

swap(交换元素)

        用于交换指定列表中两个指定位置上的元素。

// 示例10 :使用 swap 交换列表中的元素private static void swapList() {// 创建一个包含若干元素的列表List<String> fruitList = new ArrayList<>();fruitList.add("Apple");fruitList.add("Banana");fruitList.add("Cherry");fruitList.add("Date");System.out.println("交换前的列表: " + fruitList);// 使用Collections.swap方法交换列表中指定位置的元素// 交换索引为1和索引为3的元素(也就是交换 "Banana" 和 "Date")Collections.swap(fruitList, 1, 3);System.out.println("交换后的列表: " + fruitList);}

rotate(元素右移)

        用于将指定列表中的元素向右旋转指定的距离。旋转操作会改变列表中元素的顺序,但是不会改变列表的大小。如果旋转的距离大于列表的大小,那么这个距离会被列表的大小取模。旋转的距离是指列表中的元素将要移动的位置数。如果距离是正数,元素将向右移动;如果距离是负数,元素将向左移动。

示例代码

// 示例11 :使用 rotate 向右旋转列表中的元素private static void rotateList() {// 创建一个包含若干元素的列表List<String> fruitList = new ArrayList<>();fruitList.add("Apple");fruitList.add("Banana");fruitList.add("Cherry");fruitList.add("Date");// 打印原始列表System.out.println("Original list: " + fruitList);// 向右旋转列表中的元素,距离为2Collections.rotate(fruitList, 2);// 打印旋转后的列表System.out.println("Rotated list: " + fruitList);}

replaceAll(替换全部)

        用于将列表中所有出现的一个指定的元素替换为另一个元素。这个方法会修改原始的列表。调用此方法时,列表中的所有匹配元素都会被替换。

示例代码

 // 示例12 :replaceAll 替换列表中的元素private static void replaceAll(){// 创建一个包含若干元素的列表List<String> fruitList2 = new ArrayList<>();fruitList2.add("Apple");fruitList2.add("Banana");fruitList2.add("Cherry");fruitList2.add("Date");// 打印原始列表System.out.println("Original list: " + fruitList2);// 使用Collections.replaceAll方法替换列表中的元素 将列表中的 "Banana" 替换为 "Grape"Collections.replaceAll(fruitList2, "Banana", "Grape");// 打印替换后的列表System.out.println("Replaced list: " + fruitList2);}

indexOfSubList(找到第一个包含子元素的位置)

        用于返回列表中第一次出现的指定子列表的起始索引,如果列表不包含子列表,则返回 -1。

lastIndexOfSubList(找到最后一个包含子元素的位置)

        用于返回列表中最后一次出现的指定子列表的起始索引,如果列表不包含子列表,则返回 -1。

示例代码

 // 示例13 :indexOfSubList 和 lastIndexOfSubList 查找子列表的位置private static void indexOfSubList(){// 创建一个包含若干元素的列表List<String> fruitList3 = new ArrayList<>();fruitList3.add("Apple");fruitList3.add("Banana");fruitList3.add("Cherry");fruitList3.add("Date");fruitList3.add("Apple");fruitList3.add("Banana");// 创建一个包含若干元素的子列表List<String> subList = new ArrayList<>();subList.add("Apple");subList.add("Banana");// 使用Collections.indexOfSubList方法查找子列表的位置int index1 = Collections.indexOfSubList(fruitList3, subList);System.out.println("Index of sublist: " + index1);// 使用Collections.lastIndexOfSubList方法查找子列表的位置int index2 = Collections.lastIndexOfSubList(fruitList3, subList);System.out.println("Last index of sublist: " + index2);}

checkedCollection(进行类型检查的集合)

        用于创建一个动态类型安全的集合视图。在运行时会对添加、修改等操作涉及的元素类型进行严格检查,确保集合中的元素类型符合指定的类型要求,若不符合则抛出 ClassCastException 异常,以此增强程序的类型安全性。同样也有针对List、 Set 和 Map 的方法如 checkedList、checkedSet和 checkedMap。

示例代码

 // 示例14 : 使用checkedCollection创建类型检查集合private static void checkedCollection(){ArrayList rawList = new ArrayList<>();rawList.add(1);rawList.add("hello");// 创建一个只允许存放Integer类型元素的检查集合,以rawList为基础Collection checkedCollection = Collections.checkedCollection(rawList, Integer.class);try {// 尝试添加一个符合要求的Integer元素,操作正常checkedCollection.add(2);// 尝试添加一个不符合要求的String元素,会抛出ClassCastExceptioncheckedCollection.add("world");} catch (ClassCastException e) {System.out.println("类型不匹配,出现异常: " + e.getMessage());}}

emptyList(创建一个空集合)

        该方法常用于需要返回一个空列表的情况,避免创建不必要的可变列表实例,提升性能和代码的简洁性。同样也有针对Set 和 Map 的方法如emptySet和emptyMap 等。

singletonList(单元素集合)

        方法会创建一个不可变的列表,该列表只包含一个指定的元素。这个列表的长度固定为 1,同样也是不可变的,任何修改操作都会引发 UnsupportedOperationException 异常。常用于只需要表示单个元素的列表场景,比如某些方法要求传入一个列表参数,但实际只有一个值的情况。同样也有针对Set和Map的方法如singleton和singletonMap。

示例代码

// 示例15. 创建空集合,单元素集合private static void emptyAndSingleton(){// 示例18. 创建空集合List<String> empty = Collections.emptyList();System.out.println("创建的空列表: " + empty);// 示例19. 创建单元素集合List<String> singleton = Collections.singletonList("hello");System.out.println("创建的单元素列表: " + singleton);// 创建单元素只读MapMap<String, Integer> readOnlyMap = Collections.singletonMap("key", 1);System.out.println("创建的只读Map: " + readOnlyMap);// 创建不可变SetSet<String> immutableSet2 = Collections.singleton("hello");System.out.println("创建的不可变Set: " + immutableSet2);}

frequency(统计元素出现次数)

        方法用于统计指定元素在给定集合中出现的次数。它遍历整个集合,通过比较元素是否相等(使用 equals 方法判断)来确定指定元素出现的频次,然后返回对应的整数值。

示例代码

  // 示例15.frequency 计算元素出现的次数private static void frequency(){List<String> list = new ArrayList<>();list.add("apple");list.add("banana");list.add("apple");int count = Collections.frequency(list, "apple");System.out.println("元素 'apple' 在列表中出现的次数: " + count);}

disjoint(判断两个列表是否不相交)

        用于判断两个集合是否没有共同的元素(即是否 “不相交”)。它会遍历两个集合中的元素,通过比较元素是否相等(使用 equals 方法判断)来确定它们之间是否存在交集。如果两个集合没有任何相同的元素,则返回 true;反之,若存在至少一个相同元素,则返回 false

示例代码

 // 示例16.disjoint 判断两个集合是否有交集private static void disjoint(){List<String> list1 = new ArrayList<>();list1.add("a");list1.add("b");List<String> list2 = new ArrayList<>();list2.add("c");list2.add("d");boolean disjoint = Collections.disjoint(list1, list2);System.out.println("两个集合是否不相交: " + disjoint);List<String> list3 = new ArrayList<>();list3.add("a");list3.add("e");disjoint = Collections.disjoint(list1, list3);System.out.println("另外两个集合是否不相交: " + disjoint);}

newSetFromMap

        方法利用给定的 Map 来创建一个 Set。实际上返回的 Set 实现是基于传入的 Map 的,Set 中的元素对应 Map 的键,添加到 Set 中的元素会在 Map 中相应地添加键,并将对应的值设置为 Boolean.TRUE。这个方法常用于需要自定义 Set 的一些特性(例如基于特定的 Map 实现来获得不同的性能、同步等特性)的场景。

示例代码

// 示例17. 使用newSetFromMap创建基于Map的Setprivate static void newSetFromMap(){Map<String, Boolean> underlyingMap = new HashMap<>();// 基于自定义的Map创建一个SetSet<String> customSet = Collections.newSetFromMap(underlyingMap);customSet.add("element1");customSet.add("element2");System.out.println("基于Map创建的Set: " + customSet);System.out.println("对应的Map内容: " + underlyingMap);}

相关推荐

        开源项目 JavaUsefulMode:JavaUsefulMode: 基于Java 语言的自定义实用工具集

        JavaUsefulMode是小编编写Java方向学习专栏时的代码示例汇总总结,其中包含了本章节对于java.util.Collections的工具类学习的代码示例,感兴趣的小伙伴可以直接下载学习。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【pytorch】循环神经网络

如果说卷积神经网络可以有效地处理空间信息&#xff0c;那么循环神经网络则可以更好地处理序列信息。循环神经网络通过引入状态变量存储过去的信息和当前的输入&#xff0c;从而可以确定当前的输出。 1 循环神经网络 隐藏层和隐状态指的是两个截然不同的概念。隐藏层是在从输…

MySQL root用户密码忘记怎么办(Reset root account password)

在使用MySQL数据库的的过程中&#xff0c;不可避免的会出现忘记密码的现象。普通用户的密码如果忘记&#xff0c;可以用更高权限的用户&#xff08;例如root&#xff09;进行重置。但是如果root用户的密码忘记了&#xff0c;由于root用户本身就是最高权限&#xff0c;那这个方法…

GPU 进阶笔记(二):华为昇腾 910B GPU

大家读完觉得有意义记得关注和点赞&#xff01;&#xff01;&#xff01; 1 术语 1.1 与 NVIDIA 术语对应关系1.2 缩写2 产品与机器 2.1 GPU 产品2.2 训练机器 底座 CPU功耗操作系统2.3 性能3 实探&#xff1a;鲲鹏底座 8*910B GPU 主机 3.1 CPU3.2 网卡和网络3.3 GPU 信息 3.3…

word中插入zotero引用

1、参考文献末尾没有文献&#xff1f; 在文献条目要显示的地方点击“refresh” 2、参考文献条目没有悬挂缩进&#xff1f; 把“书目”添加到样式库中&#xff0c;修改样式为悬挂缩进1.5字符 3、交叉引用&#xff1f; 宏 新建一个宏 粘贴下面代码 Public Sub ZoteroLinkCita…

【服务器项目部署】⭐️将本地项目部署到服务器!

目录 &#x1f378;前言 &#x1f37b;一、服务器选择 &#x1f379; 二、服务器环境部署 2.1 java 环境部署 2.2 mysql 环境部署 &#x1f378;三、项目部署 3.1 静态页面调整 3.2 服务器端口开放 3.3 项目部署 ​ &#x1f379;四、测试 &#x1f378;前言 小伙伴们大家好…

【mysql】MVCC及实现原理

【mysql】MVCC及实现原理 【一】介绍【1】什么是MVCC【2】什么是当前读和快照读【3】当前读&#xff0c;快照读和MVCC的关系【4】MVCC 能解决什么问题&#xff0c;好处&#xff08;1&#xff09;数据库并发场景有三种&#xff0c;分别为&#xff1a;&#xff08;2&#xff09;M…

AI对话机器人简单实现--智谱BigModel+SpringBoot+Vue2+ElementUI

成品展示 一、首先去注册个账号然后申请个API keys 二、引入依赖 <dependency><groupId>cn.bigmodel.openapi</groupId><artifactId>oapi-java-sdk</artifactId><version>release-V4-2.3.0</version></dependency><depend…

FPGA多路红外相机视频拼接输出,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的红外相机图像处理解决方案本博已有的已有的FPGA视频拼接叠加融合方案 3、工程详细设计方案工程设计原理框图红外相机FDMA多路视频拼接算法FDMA图像缓存视…

Navicat 连接 SQL Server 详尽指南

Navicat 是一款功能强大的数据库管理工具&#xff0c;它提供了直观的图形界面&#xff0c;使用户能够轻松地管理和操作各种类型的数据库&#xff0c;包括 SQL Server。本文将详尽介绍如何使用 Navicat 连接到 SQL Server 数据库&#xff0c;包括安装设置、连接配置、常见问题排…

【JAVA】Java常用注解汇总

一、注解的定义 Java注解是Java编程语言中的一种特殊形式的元数据&#xff0c;它们可以用于为程序的各个元素&#xff08;例如类、方法、字段等&#xff09;添加额外的信息和属性。注解是在Java 5中引入的&#xff0c;通过在代码中使用注解&#xff0c;开发人员可以提供关于程…

debian安装Nginx

编译安装Nginx sudo apt-get update 环境准备 编译Nginx需要gcc的环境支持&#xff0c;build-essential内包含gcc套件&#xff0c;所以我们安装build-essential即可&#xff1a; sudo apt-get install build-essential 因为nginx.conf中使用了正则表达式&#xff0c;所以编…

基于PLC的电梯控制系统(论文+源码)

1.系统设计 电梯采用了PLC控制方式&#xff0c;通过对PLC进行逻辑程序设计&#xff0c;电梯不仅在控制水平上得到了质的提升&#xff0c;同时在安全性上也得到了大大提高。控制系统在构造上实现了简洁化&#xff0c;不仅优化了硬件接线方便了线路施工&#xff0c;同时对控制要…

MySQL从入门到入土---MySQL表的约束 (内含实践)---详细版

目录 引入&#xff1a; null 与not null default&#xff1a; comment列描述 &#xff1a; not null 和 default&#xff1a; zerofill &#xff1a; 主键&#xff1a;primary key 复合主键&#xff1a; 自增长:auto_increment 唯一键&#xff1a;unique key 外键&a…

linux安装nginxs报错:openssl not found

系统&#xff1a; linux 版本&#xff1a;centOS7 nginx版本&#xff1a;nginx-1.20.2 linux安装nginx时 执行下面命令时报错&#xff1a; ./configure --with-http_stub_status_module --with-http_ssl_module --prefix/usr/local/nginxchecking for OpenSSL library ... not …

Flutter:打包apk,详细图文介绍

困扰了一天&#xff0c;终于能正常打包apk安装了&#xff0c;记录下打包的流程。建议参考我这篇文章时&#xff0c;同时看下官网的构建说明。 官网构建并发布 Android 应用详情 1、AS创建Flutter项目 2、cmd执行命令 生成一个sunluyi.jks的文件&#xff0c;可以自行把sunluyi替…

shell命令以及运行原理

目录 一、命令解释器 1、什么是命令行解释器 shell和bash联系 2、为什么用命令行解释器 作用 存在意义 二、Linux权限 1、用户分类 2、Linux权限管理 1&#xff09;权限身份 2&#xff09;文件类型和访问权限 3&#xff09;文件访问权限的相关设置方法 a. chmod …

精准识别花生豆:基于EfficientNetB0的深度学习检测与分类项目

精准检测花生豆&#xff1a;基于EfficientNet的深度学习分类项目 在现代农业生产中&#xff0c;作物的质量检测和分类是确保产品质量的重要环节。针对花生豆的检测与分类需求&#xff0c;我们开发了一套基于深度学习的解决方案&#xff0c;利用EfficientNetB0模型实现高效、准…

CSS利用浮动实现文字环绕右下角,展开/收起效果

期望实现 文字最多展示 N 行&#xff0c;超出部分截断&#xff0c;并在右下角显示 “…” “更多”&#xff1b; 点击更多&#xff0c;文字展开全部内容&#xff0c;右下角显示“收起”。效果如下&#xff1a; 思路 尽量使用CSS控制样式&#xff0c;减少JS代码复杂度。 利…

FOC控制原理-HALL传感器测量电角度

0、相关文章 【电机控制算法】基于霍尔位置传感器(HALL)估算连续电角度&#xff08;基于STM32F407CubeMXHAL&#xff09;_峰岹hall-CSDN博客 电机控制【FOC】_SimpleFOC_通过 Hall 计算电机角度和速度原理 - 大大通(简体站) (wpgdadatong.com.cn) STM32 FOC SDK2.0中使用hall传…

手机实时提取SIM卡打电话的信令声音-智能拨号器的SIP线路-双卡双待单通方案

手机实时提取SIM卡打电话的信令声音 --智能拨号器的SIP线路-双卡双待单通方案 一、前言 蓝牙电话的技术方案最初是从蓝牙耳机和车机蓝牙的使用领域延伸出来的技术方式。通过蓝牙的HFP协议&#xff0c;把手机通话的声音和通话事件状态提取出来进行复用和处理。但中国大陆现行…