开发圈高频、贴近 JDK8~JDK21、面试 / 日常吐槽梗,分分类好记
一、Lambda & Stream 流式梗(1–10)
- 一行 Stream,bug 藏三天;for 循环十行,一眼看穿
- peek 只许打印,写业务修改代码审查必标红
- 流是一次性渣男,用过一次直接报废
- parallelStream:小数据提速 1ms,大数据 OOM 半小时
- 以为 flatMap 万能,写完嵌套 List 套 List 原地懵
- toMap 不传第三个参数,重复键线上直接抛异常祭天
- groupingBy 不指定下游收集器,永远返回 List,想求和还要套两层
- 写 findFirst.get (),生产环境定时炸弹
- orElse 和 orElseGet 分不清,耗时方法白白执行一万次
- 链式写三四十个中间操作,出异常找不到哪一步报错
二、空指针 & Optional 梗(11–20)
- Optional 是容器不是 null 替身,无脑 get 等于裸奔
- Optional.of 传 null 当场 NPE,永远记混 of 和 ofNullable
- 实体 status 直接 equals 常量,少写常量在前,null 直接崩
- String == 判断字符串,测试本地没问题,线上全崩
- list.get (0) 不判 isEmpty,空列表定时任务天天报错
- Map.get (key) 直接取值,忘了 key 不存在返回 null
- 子对象不判空连环调用:user.getOrder ().getPay () 三层 NPE
- 包装类 Integer == 对比,超过 128 直接判不相等
- 数组下标硬编码,改长度全数组越界
- 入参不做非空校验,前端不传字段后台直接 500
三、并发、并行、线程池梗(21–30)
- 并行流共用公共 ForkJoin 池,一个 IO 阻塞全项目并行卡死
- 不用自定义线程池,new Thread 开线程,运维看线程监控崩溃
- 线程池无队列无拒绝策略,任务暴涨 OOM
- ThreadLocal 用完不 remove,内存泄漏 + 数据串线程
- 多线程操作 ArrayList,没锁疯狂并发修改异常
- synchronized 加在方法上,锁范围太大吞吐量暴跌
- CountDownLatch 忘记 countDown,主线程无限阻塞
- CompletableFuture 异常不捕获,悄无声息丢失任务结果
- volatile 只保证可见性,拿来做计数锁,数据错乱
- 定时任务单线程,上一个没跑完下一个叠加堆积
四、集合、内存、分片 OOM 梗(31–38)
- 百万数据一次性查全量 List,不做分片,高峰期直接堆溢出
- HashMap 初始化不指定容量,频繁扩容疯狂复制数组
- 遍历集合同时 add/remove,并发修改异常常客
- subList 只是视图,clear 不会清空原集合,以为释放内存白忙活
- 循环内不停 new Lambda,大量匿名类 GC 频繁 STW 卡顿
- 大集合不 clear 直接丢弃,引用链残留老年代内存泄漏
- toUnmodifiableList 返回不可变集合,add 直接抛不支持操作异常
- 拼接字符串用 + 循环十万次,堆里成千上万个中间 String
五、异常、编码、规范梗(39–45)
- Lambda 不能抛受检异常,try-catch 塞满整个表达式丑到爆炸
- catch Exception 吞掉所有异常,线上出问题日志啥都没有
- finally 里写 return,覆盖正常返回值,排查半年才找到
- 日志用字符串拼接 +,不用占位符,没开启日志也执行拼接
- 打印 e.getMessage () 不打印堆栈,只知道报错不知道哪里错
- main 方法 throws Exception,线上一报错进程直接挂
- 工具类构造方法不私有,外部随便 new 空实例
六、版本、语法、经典老梗(46–50)
- JDK8 写惯 Lambda,切换 JDK21 虚拟线程代码不会写
- record 记录类以为能 set 字段,全是 final 只能构造赋值
- switch 旧写法漏 break,穿透逻辑改出隐形 bug
- 枚举不重写 equals,拿 == 和枚举值对比偶尔失效
- 注解修饰 Lambda 无效,以为加注解能做参数校验
精简速记版(浓缩记忆)
- Stream 一次性、peek 不改业务、并行流慎用
- Optional 禁止无脑 get,常量放前面判等防 NPE
- 并行共用池、ThreadLocal 用完清理、自定义线程池
- 大数据必分片,集合初始化给容量
- Lambda 不抛受检异常,日志用占位符,异常打印堆

9175

被折叠的 条评论
为什么被折叠?



