背景与动机
Java 标准库里有很多“不是业务模型、但每天都会用到”的辅助类,比如判空、数组操作、集合排序、数学运算、时间戳获取等。
这类工具类本身不复杂,但因为出现频率很高,越早熟悉越能提升写代码的速度和稳定性。
核心原理拆解
1. Objects:判空、比较、生成哈希值
Objects 是现代 Java 里很常用的一组基础工具方法。
String name = null;System.out.println(Objects.isNull(name));System.out.println(Objects.nonNull(name));System.out.println(Objects.equals("a", "a"));它最常见的用途有:
Objects.equals(a, b):安全比较两个对象,避免空指针Objects.requireNonNull(obj):快速做非空校验Objects.hash(...):生成哈希值
2. Arrays:数组转字符串、排序、查找
int[] nums = {3, 1, 2};Arrays.sort(nums);System.out.println(Arrays.toString(nums));Arrays 最常见的用法有:
Arrays.sort(array):排序Arrays.toString(array):把数组友好打印出来Arrays.binarySearch(array, key):二分查找Arrays.asList(...):把多个元素快速转成列表视图
3. Collections:操作集合
List<Integer> list = new ArrayList<>();list.add(3);list.add(1);list.add(2);
Collections.sort(list);Collections.reverse(list);常见方法有:
Collections.sort(list):排序Collections.reverse(list):反转Collections.shuffle(list):打乱Collections.max(list)/min(list):最大值 / 最小值
4. Math:数学运算
System.out.println(Math.max(3, 5));System.out.println(Math.abs(-10));System.out.println(Math.round(3.6));Math 常用于:
- 取绝对值:
abs - 最大最小值:
max、min - 四舍五入:
round - 向上 / 向下取整:
ceil、floor - 幂运算和平方根:
pow、sqrt
5. System:标准输入输出和时间
System.out.println("hello");System.out.println(System.currentTimeMillis());最常见的有:
System.out.println(...):标准输出System.currentTimeMillis():当前时间戳System.exit(code):结束程序
6. 工具类一般为什么都是静态方法
因为工具类通常不需要保存对象状态,只是提供一组通用能力,所以直接设计成“类名.方法名”的静态调用形式最自然。
这也是为什么很多工具类常常会配一个私有构造方法,避免外部无意义地 new 出实例。
最小可运行代码示例
import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.List;import java.util.Objects;
public class UtilityClassDemo { public static void main(String[] args) { int[] nums = {3, 1, 2}; Arrays.sort(nums);
List<Integer> list = new ArrayList<>(); list.add(3); list.add(1); list.add(2); Collections.sort(list);
System.out.println(Arrays.toString(nums)); System.out.println(list); System.out.println(Objects.equals("java", "java")); System.out.println(Math.max(10, 20)); System.out.println(System.currentTimeMillis()); }}常见陷阱与错误示例
1. 直接打印数组对象
int[] nums = {1, 2, 3};System.out.println(nums);这通常不会得到想看的数组内容。要打印内容,优先用 Arrays.toString(nums)。
2. 误以为 Arrays.asList 返回的是普通可变 ArrayList
它返回的是一个固定长度的列表视图,不能随意 add、remove。
3. 忘记用 Objects.equals 做安全比较
如果对象可能为 null,直接调用 a.equals(b) 可能空指针,用 Objects.equals(a, b) 更稳。
面试高频问题
1. 为什么工具类常用静态方法
因为工具类通常不需要对象状态,只是提供通用能力,所以直接用静态方法调用最简单、最自然。
2. Objects.equals 和直接 equals 有什么区别
Objects.equals(a, b) 会帮你处理 null,更安全;直接 a.equals(b) 在 a 为 null 时会抛空指针。
3. Arrays 和 Collections 分别操作什么
Arrays 主要操作数组,Collections 主要操作集合。
一句话总结
Objects、Arrays、Collections、Math、System 这些工具类不难,但使用频率极高,越早熟悉越能减少重复劳动和低级错误。