766 字
约 2 分钟
7
S06-B04 · JDK 自带工具类:Arrays/Collections/Objects/Scanner

适用读者:还在手写排序、判空、数组转 List 的人。
前置:S06-B01。
覆盖旧文:A-1801(139) A-1802(96) A-1805(48) A-1806(58) = 341 点。
上一篇:S06-B03 · 序列化:Java 原生 vs Jackson
下一篇:S06-B05 · 第三方工具库。


1. 一句话结论

JDK 已经提供了 80% 的"工具方法"。先查 JDK,再考虑第三方库——因为 JDK 的没有额外依赖,也没有版本冲突。


2. Arrays:数组专用(A-1801)

方法 用途 注意
Arrays.sort(a) 排序(基本类型双轴快排,对象归并) 稳定与否不同
Arrays.asList(...) 转 List 返回定长视图,不能 add
Arrays.copyOf(a, n) 拷贝/扩容 浅拷贝
Arrays.fill(a, v) 填充 —
Arrays.equals(a, b) 内容比较 别用 ==
Arrays.toString(a) 打印 一维;多维用 deepToString
Arrays.binarySearch(a, k) 二分 要求已排序

最大的坑:Arrays.asList 返回的是 Arrays$ArrayList(不是 java.util.ArrayList),不支持增删。要可变就 new ArrayList<>(Arrays.asList(...))。


3. Collections:集合专用(A-1802)

方法 用途
Collections.sort(list) 列表排序
Collections.unmodifiableList(l) 只读视图(不是副本)
Collections.singletonList(x) 单元素不可变列表
Collections.emptyList() 空不可变列表(省内存)
Collections.synchronizedList(l) 全表锁包装(S05-J02 说过它的性能问题)
Collections.reverse/shuffle/swap 原地操作

注意:unmodifiableList 是视图——原列表改了,只读视图也会变。


4. Objects:判空与比较(A-1805)

方法 用途
Objects.equals(a, b) 空安全比较
Objects.hash(...) 组合 hashCode
Objects.requireNonNull(x, "msg") 参数校验(快速失败)
Objects.isNull/nonNull 判空(用于 Predicate)
Objects.toString(x, "默认") 空安全字符串化

判据:"这里会不会 NPE?" 会 → 用 Objects.*;不会 → 直接写更清楚。


5. Scanner:控制台与文件(A-1806)

try (Scanner sc = new Scanner(System.in)) {
    while (sc.hasNextLine()) { String line = sc.nextLine(); }
}
用途 注意
读控制台 System.in
读文件 new Scanner(new File(path), StandardCharsets.UTF_8)
解析数字 nextInt() 会抛 InputMismatchException
性能 Scanner 慢(正则解析),大文件用 BufferedReader

6. 五个误区

误区 真相
"Arrays.asList 返回可变 List" 定长视图,add 抛 UnsupportedOperationException
"unmodifiableList 是副本" 是视图
"a == b 能比数组内容" 比引用
"Objects.hash 结果稳定" 不保证跨版本一致
"Scanner 适合大文件" 慢,用 BufferedReader

7. 自检

  1. Arrays.asList 有什么限制?怎么得到可变 List?
  2. unmodifiableList 与 List.copyOf 的区别?
  3. Objects.requireNonNull 适合用在哪?
  4. Arrays.equals 与 == 的差别?
  5. 为什么大文件不用 Scanner?

8. 下一篇

S06-B05 · 第三方工具库:Guava / Hutool / StringUtils

JDK 工具讲完,下一篇看三个常用第三方库:它们补了什么、重叠在哪、怎么选。


本篇属于系列《S06 · Java 工程化与组件》。旧文来源:A-1801/1802/1805/1806。

S06-B04 · JDK 自带工具类:Arrays/Collections/Objects/Scanner
https://www.clxhxhhr.top/posts/5258/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。