Java Collections工具类指南

news2025/4/25 5:58:54

一、Collections工具类概述

java.util.Collections是Java集合框架中提供的工具类,包含大量静态方法用于操作和返回集合。这些方法主要分为以下几类:

  • 排序操作
  • 查找和替换
  • 同步控制
  • 不可变集合
  • 特殊集合视图
  • 其他实用方法

二、排序操作

1. 自然排序

List<String> list = new ArrayList<>(Arrays.asList("banana", "apple", "pear"));

// 自然排序(升序)
Collections.sort(list);
System.out.println(list); // [apple, banana, pear]

// 逆序排序
Collections.sort(list, Collections.reverseOrder());
System.out.println(list); // [pear, banana, apple]

2. 自定义排序

// 使用Comparator
Collections.sort(list, (s1, s2) -> s1.length() - s2.length());
System.out.println(list); // [pear, apple, banana]

// Java 8+更简洁的写法
Collections.sort(list, Comparator.comparingInt(String::length));

3. 随机排序

Collections.shuffle(list);
System.out.println(list); // 随机顺序,如:[banana, pear, apple]

4. 旋转操作

List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

// 向右旋转2位
Collections.rotate(numbers, 2);
System.out.println(numbers); // [4, 5, 1, 2, 3]

// 向左旋转1位
Collections.rotate(numbers, -1);
System.out.println(numbers); // [5, 1, 2, 3, 4]

三、查找和替换操作

1. 二分查找

List<Integer> sortedList = Arrays.asList(1, 3, 5, 7, 9);

// 元素存在
int index = Collections.binarySearch(sortedList, 5);
System.out.println(index); // 2

// 元素不存在
index = Collections.binarySearch(sortedList, 6);
System.out.println(index); // -4 (插入点为3,返回-3-1)

2. 极值查找

List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9);

// 最大值
Integer max = Collections.max(numbers);
System.out.println(max); // 9

// 最小值(自定义比较器)
Integer min = Collections.min(numbers, Comparator.reverseOrder());
System.out.println(min); // 9(因为比较器反转)

3. 频率统计

int frequency = Collections.frequency(numbers, 1);
System.out.println(frequency); // 2

4. 替换操作

List<String> words = new ArrayList<>(Arrays.asList("apple", "banana", "apple"));

// 替换所有匹配元素
Collections.replaceAll(words, "apple", "orange");
System.out.println(words); // [orange, banana, orange]

// 填充元素
Collections.fill(words, "fruit");
System.out.println(words); // [fruit, fruit, fruit]

四、同步控制

1. 同步包装器

// 创建线程安全集合
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
Map<String, Integer> syncMap = Collections.synchronizedMap(new HashMap<>());
Set<Integer> syncSet = Collections.synchronizedSet(new HashSet<>());

// 使用示例
synchronized (syncList) {  // 需要手动同步迭代操作
    Iterator<String> it = syncList.iterator();
    while (it.hasNext()) {
        System.out.println(it.next());
    }
}

2. 注意事项

  • 同步集合的方法都是同步的
  • 迭代操作需要额外同步
  • Java 5+推荐使用java.util.concurrent包中的并发集合

五、不可变集合

1. 空集合

List<String> emptyList = Collections.emptyList();
Set<Integer> emptySet = Collections.emptySet();
Map<String, String> emptyMap = Collections.emptyMap();

// 不可修改
// emptyList.add("item"); // 抛出UnsupportedOperationException

2. 单元素集合

List<String> singletonList = Collections.singletonList("one");
Set<Integer> singletonSet = Collections.singleton(2);
Map<String, Integer> singletonMap = Collections.singletonMap("key", 3);

// 不可修改
// singletonList.add("two"); // 抛出UnsupportedOperationException

3. 不可修改视图

List<String> mutableList = new ArrayList<>(Arrays.asList("a", "b", "c"));
List<String> unmodifiableList = Collections.unmodifiableList(mutableList);

// 通过视图修改会抛出异常
// unmodifiableList.add("d"); // UnsupportedOperationException

// 原始列表修改会影响视图
mutableList.add("d");
System.out.println(unmodifiableList); // [a, b, c, d]

六、特殊集合视图

1. 类型安全视图

List rawList = new ArrayList();
rawList.add("string");
rawList.add(1);

// 创建类型安全视图
List<String> checkedList = Collections.checkedList(rawList, String.class);
// checkedList.add(2); // 抛出ClassCastException

2. 不可修改视图

List<String> immutableView = Collections.unmodifiableList(mutableList);
Set<Integer> immutableSetView = Collections.unmodifiableSet(new HashSet<>(numbers));
Map<String, Integer> immutableMapView = Collections.unmodifiableMap(new HashMap<>());

3. 单例视图

Set<String> singleton = Collections.singleton("unique");
List<Integer> singletonList = Collections.singletonList(42);
Map<String, String> singletonMap = Collections.singletonMap("key", "value");

七、其他实用方法

1. 反转顺序

List<Integer> nums = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
Collections.reverse(nums);
System.out.println(nums); // [5, 4, 3, 2, 1]

2. 交换元素

Collections.swap(nums, 0, 4);
System.out.println(nums); // [1, 4, 3, 2, 5]

3. 添加多个元素

Collections.addAll(nums, 6, 7, 8);
System.out.println(nums); // [1, 4, 3, 2, 5, 6, 7, 8]

4. 不相交检查

List<Integer> list1 = Arrays.asList(1, 2, 3);
List<Integer> list2 = Arrays.asList(4, 5, 6);
boolean disjoint = Collections.disjoint(list1, list2);
System.out.println(disjoint); // true

八、Java 8+增强功能

1. 新增方法

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// 替换所有元素
names.replaceAll(String::toUpperCase);
System.out.println(names); // [ALICE, BOB, CHARLIE]

// 删除满足条件的元素
names.removeIf(name -> name.length() > 4);
System.out.println(names); // [BOB]

2. 与Stream API结合

List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9);

// 转换为不可修改集合
List<Integer> immutable = Collections.unmodifiableList(
    numbers.stream()
        .filter(n -> n > 2)
        .sorted()
        .collect(Collectors.toList())
);
System.out.println(immutable); // [3, 4, 5, 9]

九、性能考虑与最佳实践

1. 排序性能

  • Collections.sort()使用优化的归并排序算法
  • 平均和最坏时间复杂度均为O(n log n)
  • 对于小列表(元素数<7),使用插入排序

2. 同步集合选择

场景推荐实现
读多写少CopyOnWriteArrayList
高并发MapConcurrentHashMap
阻塞队列ArrayBlockingQueue/LinkedBlockingQueue
简单同步Collections.synchronizedXXX

3. 最佳实践

  1. 优先使用不可变集合:保证线程安全
  2. 避免频繁排序:大数据集考虑使用TreeSet/TreeMap
  3. 正确使用同步包装器:迭代操作需要额外同步
  4. 合理选择集合类型:根据访问模式选择实现类

十、实际应用案例

1. 实现多值Map

Map<String, List<String>> multiMap = new HashMap<>();

// 使用computeIfAbsent简化操作
multiMap.computeIfAbsent("fruits", k -> new ArrayList<>()).add("apple");
multiMap.computeIfAbsent("fruits", k -> new ArrayList<>()).add("banana");

// 使用Collections工具类创建空列表
multiMap.putIfAbsent("vegetables", Collections.emptyList());

2. 数据统计分析

List<Integer> scores = Arrays.asList(85, 92, 78, 90, 82, 95, 88);

// 计算统计信息
int max = Collections.max(scores);
int min = Collections.min(scores);
double avg = scores.stream().mapToInt(i -> i).average().orElse(0);

// 获取前3名
List<Integer> top3 = scores.stream()
    .sorted(Collections.reverseOrder())
    .limit(3)
    .collect(Collectors.toList());

3. 安全发布集合

public class DataHolder {
    private final List<String> data;
    
    public DataHolder(Collection<String> input) {
        // 防御性复制+不可变包装
        this.data = Collections.unmodifiableList(new ArrayList<>(input));
    }
    
    public List<String> getData() {
        return data; // 安全发布,外部无法修改
    }
}

十一、常见问题与解决方案

1. UnsupportedOperationException

List<String> fixedSize = Arrays.asList("a", "b", "c");
// fixedSize.add("d"); // 抛出异常

// 解决方案:创建新ArrayList
List<String> mutable = new ArrayList<>(fixedSize);
mutable.add("d");

2. 并发修改异常

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));

// 错误方式
for (String s : list) {
    if (s.equals("b")) {
        list.remove(s); // 可能抛出ConcurrentModificationException
    }
}

// 正确方式1:使用迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    if (it.next().equals("b")) {
        it.remove();
    }
}

// 正确方式2:Java 8+ removeIf
list.removeIf(s -> s.equals("b"));

3. 性能陷阱

// 低效方式:频繁排序
List<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
    numbers.add(random.nextInt());
    Collections.sort(numbers); // 每次添加都排序
}

// 高效方式:批量添加后排序
List<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
    numbers.add(random.nextInt());
}
Collections.sort(numbers); // 单次排序

十二、总结

Collections工具类提供了丰富的静态方法来操作和返回集合,主要功能包括:

  1. 排序和查找sort(), binarySearch(), reverse()
  2. 同步控制synchronizedXXX()方法创建线程安全集合
  3. 不可变集合emptyXXX(), singletonXXX(), unmodifiableXXX()
  4. 特殊视图checkedXXX()类型安全视图
  5. 实用操作reverse(), shuffle(), swap()

最佳实践建议

  • 优先使用不可变集合保证线程安全
  • 大数据集排序考虑使用parallelSort()
  • 多线程环境选择适当的同步策略
  • Java 8+结合Stream API实现更简洁的操作

通过合理使用Collections工具类,可以大大提高集合操作的效率和代码的可维护性。

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

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

相关文章

深入详解人工智能数学基础——概率论中的KL散度在变分自编码器中的应用

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

测试模版x

本篇技术博文摘要 &#x1f31f; 引言 &#x1f4d8; 在这个变幻莫测、快速发展的技术时代&#xff0c;与时俱进是每个IT工程师的必修课。我是盛透侧视攻城狮&#xff0c;一名什么都会一丢丢的网络安全工程师&#xff0c;也是众多技术社区的活跃成员以及多家大厂官方认可人员&a…

Openharmony 和 HarmonyOS 区别?

文章目录 OpenHarmony 与 HarmonyOS 的区别&#xff1a;开源生态与商业发行版的定位差异一、定义与定位二、技术架构对比1. OpenHarmony2. HarmonyOS 三、应用场景差异四、开发主体与生态支持五、关键区别总结六、如何选择&#xff1f;未来展望 OpenHarmony 与 HarmonyOS 的区别…

uniapp 仿小红书轮播图效果

通过对小红书的轮播图分析&#xff0c;可得出以下总结&#xff1a; 1.单张图片时容器根据图片像素定高 2.多图时轮播图容器高度以首图为锚点 3.比首图长则固高左右留白 4.比首图短则固宽上下留白 代码如下&#xff1a; <template><view> <!--轮播--><s…

R/G-B/G色温坐标系下对横纵坐标取对数的优势

有些白平衡色温坐标系会分别对横纵坐标取对数运算。 这样做有什么优势呢? 我们知道对数函数对0-1之间的因变量值具有扩展作用。即自变量x变化比较小时,经过对数函数作用后可以把因变量扩展到较大范围内,即x变化较小时,y变化较大,增加了识别数据的识别性。 由于Raw数据中的…

AI赋能安全调度系统:智能升级与功能跃迁

安全调度系统通过AI技术的深度整合&#xff0c;实现了从传统监控到智能决策的质变升级。这种智能化转型不仅提升了系统的响应速度和处理精度&#xff0c;更重塑了整个安全管理的运行范式。以下是AI技术为安全调度系统带来的核心功能强化&#xff1a; 智能风险识别与预警能力跃…

数据结构与算法(十二):图的应用-最小生成树-Prim/Kruskal

相关文献&#xff1a; 数据结构与算法(一)&#xff1a;基础理论 数据结构与算法(二)&#xff1a;线性表的实现 数据结构与算法(三)&#xff1a;线性表算法设计练习 数据结构与算法(四)&#xff1a;斐波那契数列 数据结构与算法(五)&#xff1a;LRU 数据结构与算法(六)&#xff…

项目——高并发内存池

目录 项目介绍 做的是什么 要求 内存池介绍 池化技术 内存池 解决的问题 设计定长内存池 高并发内存池整体框架设计 ThreadCache ThreadCache整体设计 哈希桶映射对齐规则 ThreadCache TLS无锁访问 CentralCache CentralCache整体设计 CentralCache结构设计 C…

系统与网络安全------弹性交换网络(2)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 Eth-Trunk 组网中经常会遇到的问题 链路聚合技术 概述 Eth-Trunk&#xff08;链路聚合技术&#xff09;作为一种捆绑技术&#xff0c;可以把多个独立的物理接口绑定在一起&#xff0c;作为一个大带宽的逻辑…

信息系统项目管理工程师备考计算类真题讲解八

一、风险管理 示例1&#xff1a;EMV 解析&#xff1a;EMV(Expected Monetary Value)预期货币价值。一种定量风险分析技术。通过考虑各种风险事件的概率及其可能带来的货币影响&#xff0c;来计算项目的预期价值。 可以用下面的较长进行表示&#xff1a; 水路的EMV:7000*3/4(7…

优化uniappx页面性能,处理页面滑动卡顿问题

问题&#xff1a;在页面遇到滑动特别卡的情况就是在页面使用了动态样式或者动态类&#xff0c;做切换的时候页面重新渲染导致页面滑动卡顿 解决&#xff1a;把动态样式和动态类做的样式切换改为通过获取元素修改样式属性值 循环修改样式示例 bannerList.forEach((_, index)…

【玩转全栈】—— 无敌前端究极动态组件库--Inspira UI

目录 Inspira UI 介绍 配置环境 使用示例 效果&#xff1a; Inspira UI 学习视频&#xff1a; 华丽优雅 | Inspira UI快速上手_哔哩哔哩_bilibili 官网&#xff1a;https://inspira-ui.com/ Inspira UI 介绍 Inspira UI 是一个设计精美、功能丰富的用户界面库&#xff0c;专为…

《求知导刊》是CN期刊吗?学术期刊吗?

《求知导刊》是CN 期刊&#xff0c;同时也属于学术期刊。 CN 期刊的定义 CN 期刊是指在我国境内注册、经国家新闻出版署批准公开发行的期刊&#xff0c;具备国内统一连续出版物号&#xff08;CN 号&#xff09;。这是判断期刊是否为正规合法期刊的重要标准。 《求知导刊》的 C…

动手试一试 Spring Security入门

1.创建Spring Boot项目 引入Web和Thymeleaf的依赖启动器 2.引入页面Html资源文件 在项目的resources下templates目录中&#xff0c;引入案例所需的资源文件&#xff08;下载地址&#xff09;&#xff0c;项目结构如下 3.创建控制器 Controller public class FilmController…

使用若依二次开发商城系统-4:商品属性

功能3&#xff1a;商品分类 功能2&#xff1a;商品品牌 功能1&#xff1a;搭建若依运行环境前言 商品属性功能类似若依自带的字典管理&#xff0c;分两步&#xff0c;先设置属性名&#xff0c;再设置对应的属性值。 一.操作步骤 1&#xff09;数据库表product_property和pro…

PCB封装主要组成元素

PCB&#xff08;Printed Circuit Board&#xff0c;印刷电路板&#xff09;封装是指将电子元件固定在 PCB 上&#xff0c;并实现电气连接的方式。主要包括以下几类。 1. 焊盘&#xff08;Pad&#xff09; 作用&#xff1a;焊盘是 PCB 封装中最重要的元素之一&#xff0c;它是…

《ATPL地面培训教材13:飞行原理》——第1章:概述与定义

翻译&#xff1a;刘远贺&#xff1b;辅助工具&#xff1a;Cluade 3.7 第1章&#xff1a;概述与定义 目录 概述一般定义术语表符号列表希腊符号其他自我评估问题答案 概述 飞机的基本要求如下&#xff1a; 机翼产生升力&#xff1b; 机身容纳载荷&#xff1b; 尾部表面增加…

实时数字人——DH_LIVE

前两天亲手搭建了实时对话数字人VideoChat&#xff0c;今天来搭建下DH_LIVE。 DH_LIVE一个实时数字人解决方案&#xff0c;从输入文字到数字人对口型说话用时2-3秒。 今天就来实际操作下dh_live的搭建过程。 首先贴上git地址&#xff1a;https://github.com/kleinlee/DH_liv…

SDC命令详解:使用remove_sdc命令移除约束

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 remove_sdc命令用于移除当前设计中设置的所有SDC约束&#xff0c;需要注意的是&#xff0c;UPF约束不会被移除&#xff0c;要想移除UPF约束&#xff0c;需要使用r…

UI界面工程,如何使用控制台

我们通常会使用print函数向控制台输出调试信息。但创建UI界面工程时&#xff0c;默认不会显示控制台。 通过如下方法切换到控制台 项目属性—链接器—系统—子系统—窗口改为控制台