Java进阶——常用工具类

ops/2025/3/3 15:46:33/

        日常开发中,ArraysCollectionsObjects 是非常实用的工具类,提供了丰富的功能,从而可以更高效地处理数组、集合和对象。本文将详细介绍这三个工具类的重要知识细节。

本文目录

    • 一、 Arrays
        • 数组转集合
        • 并行排序优化
        • Stream 支持
    • 二、 Collections
        • 同步包装
        • 排序与查找
    • 三、 Objects
        • 空安全比较
        • 参数校验
        • 空值链式处理
    • 性能对比
    • 总结

一、 Arrays

数组转集合

将数组转换为集合是一个常见的操作,但需要注意的是,Arrays.asList() 返回的 List 是固定大小的,不支持 addremove 操作。

java">String[] skus = {"A001", "B002"};
List<String> skuList = Arrays.asList(skus); 
// 不支持 add/remove
skuList.add("C003"); // 抛出 UnsupportedOperationException
并行排序优化

当处理大量数据时,Arrays.parallelSort() 可以利用多核并行排序,比串行排序快 2 - 3 倍。

java">int[] orderAmounts = getLargeOrderData(); // 假设有10 万+数据
Arrays.parallelSort(orderAmounts); // 多核并行排序
Stream 支持

Arrays.stream() 可以将数组转换为流,方便进行各种流操作。

java">// 统计订单数量
long bigOrders = Arrays.stream(orderAmounts).filter(amount -> amount > 10000).count();



二、 Collections

同步包装

Collections.synchronizedList() 可以创建线程安全的集合,但遍历时仍需手动同步。

java">// 创建线程安全的购物车
List<CartItem> cart = Collections.synchronizedList(new ArrayList<>());
synchronized(cart) {for (CartItem item : cart) {processItem(item);}
}
排序与查找

Collections.sort() 可以对集合进行排序,Collections.binarySearch() 可以进行二分查找,但二分查找前必须先排序。

java">// 按价格排序商品
List<Product> products = getProducts();
Collections.sort(products, Comparator.comparing(Product::getPrice));// 二分查找
int index = Collections.binarySearch(products, targetProduct, priceComparator);



三、 Objects

空安全比较

Objects.equals() 可以自动处理 null 值,避免 NullPointerException

java">public boolean isSameUser(User u1, User u2) {return Objects.equals(u1.getUserId(), u2.getUserId()); // 自动处理 null 值
}
参数校验

Objects.requireNonNull() 可以对参数进行非空校验,Objects.requireNonNullElse() 可以自定义空值异常消息。

java">public void processOrder(Order order) {Objects.requireNonNull(order, "订单不能为 null");// 其他处理...
}// 自定义空值异常消息
String address = Objects.requireNonNullElse(user.getAddress(), "默认地址"
);
空值链式处理

Objects.requireNonNullElse() 可以进行多层空值防护。

java">// 获取用户所在城市(多层空值防护)
String city = Objects.requireNonNullElse(user.getAddress(),new Address()
).getCity();

以上只是总结了工具类经常使用的方法,类中还有更多使用方法,可以多看看哦。


性能对比

操作推荐方案避免方案原因
空集合返回Collections.emptyList()new ArrayList<>(0)节省内存,语义明确
数组转集合new ArrayList<>(Arrays.asList(arr))直接使用 Arrays.asList()避免固定大小限制
深度哈希码计算Objects.hash(field1, field2, ...)手动拼接哈希码自动处理 null 和数组
线程安全集合遍历手动 synchronized依赖 synchronizedXXX()防止并发修改异常



总结

  • Arrays:专注数组操作,注意 asList 的固定大小特性。
  • Collections:提供集合工具方法,理解不可变/同步集合的局限。
  • Objects:空值处理和参数校验,避免 NullPointerException



← 上一篇 Java进阶——Stream流以及常用方法详解
记得点赞、关注、收藏哦!
下一篇 Java进阶——注解一文全懂 →

http://www.ppmy.cn/ops/162805.html

相关文章

DeepSeek 助力 Vue3 开发:打造丝滑的网格布局(Grid Layout)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

Qt中应用程序框架的体系说明 及应用程序类QApplication类深度解析与应用分析

作为Qt开发者&#xff0c;我们肯定经常见到过QApplication类&#xff0c;有时候可能你看到了都没注意&#xff0c;也没太关心这个类做什么用。那你只需随便建个窗体程序的工程&#xff0c;在自动生成的工程文件main.cpp中就能看到&#xff0c;像这样&#xff1a; #include &qu…

鸿蒙ArkTs开发,后台触发数据变化后更新页面 UI事件

文章目录 1、定义全局事件管理器2、触发事件3、页面监听事件 如果你的需求是后台触发状态变化后更新页面 UI&#xff0c;而不是通过页面跳转传递数据&#xff0c;可以通过以下方式实现&#xff1a; 通过自定义事件管理器&#xff0c;后台触发事件后通知页面更新 UI。 1、定义全…

【论文阅读笔记】SL-YOLO(2025/1/13) | 小目标检测 | HEPAN、C2fDCB轻量化模块

目录 摘要 1 引言 2 相关工作 3 方法 3.1 为小目标检测增加一个头 3.2 优化网络结构 3.3 改进轻量化模块 3.3.1 C2fDCB 3.3.2 SCDown 4 实验 4.1 数据集 4.2 实验环境 4.3 与其他模型的比较 4.4 消融研究 ▲不同网络结构的分析 ▲不同模块的分析 ▲不同降采样…

Conda 环境搭建实战:从基础到进阶

在当今复杂多变的软件开发与数据科学领域&#xff0c;拥有一个稳定、可复现且易于管理的开发环境是项目成功的基石。Conda 作为一款强大的跨平台环境管理与包管理工具&#xff0c;为开发者提供了便捷高效的环境搭建与依赖管理解决方案。本文将深入探讨 Conda 环境搭建的实战技巧…

基于Matlab的多目标粒子群优化

在复杂系统的设计、决策与优化问题中&#xff0c;常常需要同时兼顾多个相互冲突的目标&#xff0c;多目标粒子群优化&#xff08;MOPSO&#xff09;算法应运而生&#xff0c;作为群体智能优化算法家族中的重要成员&#xff0c;它为解决此类棘手难题提供了高效且富有创新性的解决…

Android 布局系列(五):GridLayout 网格布局的使用

引言 在 Android 开发中&#xff0c;布局管理是 UI 设计中的重要环节。随着应用界面的复杂性增加&#xff0c;开发者需要掌握各种布局方式来应对不同的需求。除了常见的 LinearLayout、RelativeLayout和ConstraintLayout&#xff0c;Android还提供了一个非常使用的布局 -- Gri…

stm32week5

stm32学习 二.外设 14.串口发送数据包 数据包的定义&#xff1a; HEX数据包(以0xFF为包头&#xff0c;0xFE为包尾&#xff0c;实际上可自定义)&#xff1a; 固定包长&#xff0c;含包头包尾可变包长&#xff0c;含包头包尾 对于数据中不会出现包头包尾的数据可以用可变包长…