第32篇Java常用工具类Objects、Collections、Arrays深入系列导航《Java 100 天进阶之路》完整目录 |⬅️ 上一篇第31篇Java数组详解 |➡️ 下一篇第33篇Java中的static关键字详解一、核心知识点java.util.Objects类null 安全的方法equals、hashCode、toString、requireNonNull、isNull等java.util.Collections类集合的操作排序、混排、不可变集合、同步包装器java.util.Arrays类数组的操作排序、二分查找、填充、拷贝、转 Listjava.util.Comparable与Comparator对象的排序二、通俗讲解1分钟开心学1. Objects 工具类Java 7 引入专门处理可能为null的对象避免手动写if (obj ! null)。例如Objects.equals(a, b)会在 a 和 b 都为null时返回true其中一个null时返回false比a.equals(b)安全。2. Collections 工具类操作Collection和Map的静态方法sort(ListT)排序要求元素实现Comparablereverse(List)反转shuffle(List)随机打乱unmodifiableList(List)返回只读视图synchronizedList(List)返回线程安全的包装3. Arrays 工具类操作数组的静态方法sort()、binarySearch()、fill()、copyOf()、equals()asList()将数组转成List注意返回的是固定大小的Arrays.ArrayList4. 排序比较器对象自然排序实现ComparableT接口重写compareTo定制排序实现ComparatorT接口重写compare生活类比Objects就像安全扶手防止你在 null 上摔跤。Collections和Arrays就像瑞士军刀给集合和数组提供各种常用工具。三、实操代码案例 场景说明场景对员工列表进行多种排序按姓名、按工资并确保集合不可修改。importjava.util.*;importjava.util.stream.Collectors;classEmployeeimplementsComparableEmployee{privateStringname;privatedoublesalary;publicEmployee(Stringname,doublesalary){this.namename;this.salarysalary;}publicStringgetName(){returnname;}publicdoublegetSalary(){returnsalary;}// 自然排序按姓名OverridepublicintcompareTo(Employeeo){returnthis.name.compareTo(o.name);}OverridepublicStringtoString(){returnString.format(%s(%.0f),name,salary);}// 静态工厂方法用于创建 ComparatorpublicstaticComparatorEmployeebyNameComparator.comparing(Employee::getName);publicstaticComparatorEmployeebySalaryComparator.comparingDouble(Employee::getSalary);}publicclassUtilsDemo{publicstaticvoidmain(String[]args){// 1. Objects 工具类Strings1null;Strings2hello;System.out.println(Objects.equals(s1,s2));// falseSystem.out.println(Objects.hashCode(s1));// 0System.out.println(Objects.toString(s1,默认));// 默认Objects.requireNonNull(s2,s2 不能为 null);// 不抛异常// Objects.requireNonNull(s1, s1 不能为 null); // 会抛 NPE// 2. Collections 与 ArraysListIntegerlistnewArrayList(Arrays.asList(3,1,4,1,5));Collections.sort(list);System.out.println(list);// [1,1,3,4,5]Collections.reverse(list);System.out.println(list);// [5,4,3,1,1]Collections.shuffle(list);System.out.println(随机list);// 不可变集合ListIntegerunmodCollections.unmodifiableList(list);// unmod.add(10); // 抛 UnsupportedOperationException// 3. 数组工具int[]arr{5,2,8,1};Arrays.sort(arr);System.out.println(Arrays.toString(arr));intindexArrays.binarySearch(arr,8);System.out.println(8的位置index);int[]copyArrays.copyOf(arr,10);System.out.println(拷贝并扩容Arrays.toString(copy));// 4. 员工排序ListEmployeeemployeesArrays.asList(newEmployee(Bob,5000),newEmployee(Alice,7000),newEmployee(Charlie,6000));// 按姓名排序employees.sort(Employee.byName);System.out.println(按姓名employees);// 按工资排序employees.sort(Employee.bySalary);System.out.println(按工资employees);// 链式排序先按工资再按姓名employees.sort(Employee.bySalary.thenComparing(Employee.byName));}}四、避坑要点错误/误区后果正确做法Arrays.asList(arr)返回的 List 调用add/removeUnsupportedOperationException用new ArrayList(Arrays.asList(arr))修改Collections.unmodifiableXxx返回的集合抛异常不要尝试修改或先拷贝再修改Objects.equals(a, b)与a.equals(b)混淆前者 null 安全后者可能 NPE不确定是否为 null 时用Objects.equals自定义Comparator时未处理 null可能 NPE使用Comparator.nullsFirst或nullsLast五、面试高频考点Q1Objects.equals(a, b)和a.equals(b)的区别Objects.equals是 null 安全的两个都为 null 返回 true一个为 null 返回 false否则调用a.equals(b)。后者在 a 为 null 时抛 NPE。Q2Collections.sort(list)和list.sort(null)的区别功能相同list.sort(null)是List接口的默认方法Java 8 引入可以直接被集合调用。Collections.sort是旧 API内部调用了list.sort。Q3如何将数组转换成可变的ArrayListnew ArrayList(Arrays.asList(arr))六、练习题填空使用Objects.requireNonNull替代手动 null 检查。排序对一组字符串按长度排序长度相同再按字典序。动手实现一个ComparatorPerson先按年龄降序再按姓名升序。 你的学习进度当前第32篇 / 共44篇 ·第五阶段工具类、异常最佳实践、序列化第32~35篇✅ 已完成第1~31篇 正在学第32篇⏳ 待学习第33~44篇 完整目录 学习指南 | 订阅本专栏不错过每一篇 本专栏每篇都包含避坑表 面试高频考点 练习题。每天30分钟100天拿offer 下一篇文章预告《第33篇Java中的static关键字详解》内容简介静态变量/方法/代码块内存位置方法区静态导入静态方法的重写问题。 学完这篇你将彻底掌握static的语义面试再问静态成员轻松回答。《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇建议收藏 关注一起100天拿offer 点击关注我更新后第一时间收到推送