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. 自检
Arrays.asList有什么限制?怎么得到可变 List?unmodifiableList与List.copyOf的区别?Objects.requireNonNull适合用在哪?Arrays.equals与==的差别?- 为什么大文件不用
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/ 评论
0 条
还没有评论,先写一条吧。