当前位置: 首页 > news >正文

《Java 100 天进阶之路》第32篇:Java常用工具类(Objects、Collections、Arrays深入)

第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 点击关注我更新后第一时间收到推送
http://www.gsyq.cn/news/1378933.html

相关文章:

  • Python渗透测试开源项目源码精读指南:从状态机到零拷贝解析
  • 手机HTTPS抓包失败的根源与系统化排障指南
  • C++特有的bool变量使用
  • 在C++中测量代码执行时间的两种方法
  • 江苏启东寄快递省钱指南|全网高性价比寄件渠道盘点,日常寄件少花冤枉钱 - 时讯资讯
  • Android Compose 图层的合成 : BlendMode
  • Android Compose 离屏缓冲 : CompositingStrategy.Offscreen
  • 027、内存带宽瓶颈:如何设计NPU避免“内存墙”?
  • 星盘接口开发文档:推进盘接口指南
  • GESP6级C++考试语法知识(二十八、广度优先搜索(三、层级 BFS))
  • 告别杂乱GitHub和文档:手把手教你用WRITE-BUG数字空间管理小组编程项目
  • 网络运维与网络安全 阶段一 基础篇二十
  • BME280传感器扩展板设计:兼容I2C/SPI接口与可配置电源方案详解
  • 互联网大厂Java面试:从Java SE到Spring Boot的全面探讨
  • 5分钟彻底解决网盘限速烦恼:开源工具LinkSwift完全使用指南
  • 【YOLO目标检测全栈实战】77 模型剪枝:让YOLO在边缘设备上“瘦身”的硬核实践
  • Apifox 测试项目实操
  • Apple Silicon Mac 电池管理的终极解决方案:Battery Toolkit 完整指南
  • QQ群数据采集终极教程:5分钟掌握批量抓取技巧
  • 抖音批量下载工具:高效获取用户主页全作品的专业解决方案
  • 从电路图到成品板:用AD和嘉立创搞定你的第一块CC2530开发板(附完整BOM清单)
  • DeepSeek开源协议识别:为什么92%的CI/CD流水线漏报AGPL传染风险?3行代码修复方案
  • 【每周分享】EtherCAT从站代码架构的简要解析
  • 抖音批量下载终极指南:如何3步免费获取用户主页全作品
  • 医用超声相控阵图像穿透力与分辨率问题:成因分析与解决思路
  • 如何3步完成Honey Select 2完整汉化:免费专业游戏翻译工具终极指南
  • OpenVSP飞机参数化设计:从零到一的完整建模与气动分析指南
  • 代码跑偏白盒补漏:判定节点覆盖全路径测试
  • 思源宋体完全免费商用指南:7种字重中文开源字体终极教程
  • 3步掌握TuxGuitar开源吉他谱编辑器:新手也能快速上手的完整指南