Stream API 写法和可读性的取舍
这篇我想按“排查记录”来写,主题是 Stream API 写法和可读性的取舍。这种写法比纯概念文更适合我自己回看。 现象先别急着解释让 Stream 服务于清晰的数据转换,而不是炫技。 先把现象钉住,比急着下结论有用。很多时候真正的关键不是“答案是什么”,而是“我是怎么一步步排到这里的”。 我会先看哪几件事 短链路适合 Stream 复杂分支考虑普通循环 peek 不适合承载业务副作用 带入一个排查场景把订单列表按状态分组,并写...
Optional 适合解决什么问题
这篇按踩坑笔记来写,因为 Optional 适合解决什么问题 我现在更容易记住“错在哪”,而不是“定义长什么样”。 先记住这句话用 Optional 表达可能不存在的返回值,而不是替代所有 null。 很多问题不是不会用,而是用得太顺手了,顺手到把边界条件给省掉了。 这类问题一般怎么出现我脑子里会先放这个场景:重构一个查询用户昵称的方法,让调用方显式处理缺失。 一开始看着都像是个小问题,真正麻烦的是它往往不是立刻报错,而是跑一阵子...
异常处理:不要只会捕获后打印日志
今天不想写长文,先把 异常处理:不要只会捕获后打印日志 这块拆成几条短一点的问答。面试里经常会被连续追问,如果只背一句定义,第二问基本就卡住了。 先说我自己的结论按可恢复、不可恢复和用户可理解程度处理异常。 我现在会先把这类题分成“定义是什么、为什么这样设计、代码里怎么用、容易翻车在哪”四层去答。这样比死背一段话稳很多。 快问快答 底层保留原因。我现在的理解:先记结论,再回到代码里找一个能验证它的场景。 边界层转换成业务语义。我现...
泛型、通配符和类型擦除整理
今天把 泛型、通配符和类型擦除整理 补成一篇正常一点的学习笔记,不写大而全,就记我这轮最想吃透的部分。 一句话先立住把泛型看成编译期类型约束,而不是运行期魔法。 我这次真正记住的点 extends 适合读取 super 适合写入 类型擦除解释了很多运行期限制 为什么我会专门记这块因为它很容易出现一种错觉:看资料的时候觉得自己会了,真到写接口、改 SQL、配事务、看线程池参数时又开始发虚。 我现在尽量把知识点挂到一个具体场景上:给...
ArrayList 和 LinkedList 不只是查询快慢
今天不想写长文,先把 ArrayList 和 LinkedList 不只是查询快慢 这块拆成几条短一点的问答。面试里经常会被连续追问,如果只背一句定义,第二问基本就卡住了。 先说我自己的结论结合缓存友好性、遍历方式和插入位置选择集合。 我现在会先把这类题分成“定义是什么、为什么这样设计、代码里怎么用、容易翻车在哪”四层去答。这样比死背一段话稳很多。 快问快答 大多数业务读多写少用 ArrayList。我现在的理解:先记结论,再回到...
equals 和 hashCode 为什么必须一起看
这篇我想按“排查记录”来写,主题是 equals 和 hashCode 为什么必须一起看。这种写法比纯概念文更适合我自己回看。 现象先别急着解释理解对象相等性在集合中的契约。 先把现象钉住,比急着下结论有用。很多时候真正的关键不是“答案是什么”,而是“我是怎么一步步排到这里的”。 我会先看哪几件事 equals 相等则 hashCode 必须相等 参与比较的字段应尽量稳定 实体类不要随意把数据库主键和业务唯一键混用 带入一个排查...
HashMap 的底层结构和扩容过程
今天不想写长文,先把 HashMap 的底层结构和扩容过程 这块拆成几条短一点的问答。面试里经常会被连续追问,如果只背一句定义,第二问基本就卡住了。 先说我自己的结论从数组、链表、红黑树和负载因子理解 HashMap。 我现在会先把这类题分成“定义是什么、为什么这样设计、代码里怎么用、容易翻车在哪”四层去答。这样比死背一段话稳很多。 快问快答 hash 决定桶位置。我现在的理解:先记结论,再回到代码里找一个能验证它的场景。 扩容会...
String、StringBuilder 和字符串常量池复盘
这篇我想按“排查记录”来写,主题是 String、StringBuilder 和字符串常量池复盘。这种写法比纯概念文更适合我自己回看。 现象先别急着解释理解字符串不可变、拼接优化和常量池的边界。 先把现象钉住,比急着下结论有用。很多时候真正的关键不是“答案是什么”,而是“我是怎么一步步排到这里的”。 我会先看哪几件事 String 不可变便于共享 循环拼接优先考虑 StringBuilder intern 不是日常业务优化手段 ...