Java 内部原理
2026-08-10
Collectors.groupingBy() 真实验证:默认返回的是可变HashMap,不是不可变集合
真实验证Collectors.groupingBy()最基础形式真实返回Map<K,List<T>>;真实验证配合counting()/averagingInt()/mapping()等downstream collector真实能一步完成分组统计;真实验证默认返回的Map真实类型是HashMap,而指定TreeMap::new工厂真实能拿到按key排序的结果。
Java
Stream
Collectors
动画演示
Java 内部原理
2026-08-09
Optional.orElse() vs orElseGet() 真实验证:即使有值,orElse的参数也真实被求值了
真实验证Optional有值时调用orElse(expensiveMethod()),expensiveMethod()真实还是被执行了一次;真实验证orElseGet(supplier)在Optional有值时,supplier真实完全没有被调用;真实用会抛异常的方法证明orElse在Optional有值时依然会触发这个异常。
Java
Optional
陷阱
动画演示
MySQL / InnoDB
2026-08-08
Buffer Pool 为什么不怕你扫全表
LRU 冷热分区如何防止一次全表扫描冲垮缓存命中率。
内存管理
InnoDB
动画演示
MySQL / InnoDB
2026-08-08
断电之后,MySQL 怎么知道该留下什么
真实 kill -9 崩溃测试,redo log 如何保证已提交事务不丢。
持久化
崩溃恢复
动画演示
MySQL / InnoDB
2026-08-08
MVCC 如何做到读写不互相阻塞
undo log 版本链与 ReadView 可见性判断的真实过程。
事务
并发控制
动画演示
MySQL / InnoDB
2026-08-08
InnoDB 是怎么发现并解开死锁的
真实构造死锁场景,等待图检测与牺牲者选择机制。
事务
锁
动画演示
MySQL / InnoDB
2026-08-08
复合索引的列顺序,为什么不能随便排
最左前缀原则背后,复合索引在 B+树里的真实排序方式。
索引
B+树
动画演示
MySQL / InnoDB
2026-08-08
Change Buffer 是怎么把随机写攒成批量写的
二级索引随机写入如何被延迟合并成顺序 I/O。
索引
写入优化
动画演示
MySQL / InnoDB
2026-08-08
redo log 和 binlog 是怎么保持一致的
两阶段提交协议如何防止主从数据不一致。
持久化
两阶段提交
动画演示
Java 内部原理
2026-08-08
String.strip() vs trim() 真实验证:不换行空格连strip()都真实拿它没办法
真实验证trim()真实不认识全角空格\u3000,strip()真实能正确识别并去掉;但真实意外发现连strip()对不换行空格\u00A0也真实无能为力,因为Character.isWhitespace()明确把\u00A0排除在空白定义之外;真实验证isBlank()和isEmpty()的真实语义差异。
Java
String
Unicode
动画演示
Java 内部原理
2026-08-07
happens-before 真实验证:没有volatile,reader线程真实卡在死循环里永远出不来
真实验证volatile写happens-before volatile读:2000轮跨线程测试真实0次读到错误值;真实对照去掉volatile后,reader线程真实被JIT优化成死循环,自旋计数器真实永远停在0,5轮测试全部真实2秒超时都没能退出。
Java
内存模型
volatile
动画演示
Python
2026-08-06
GIL:为什么多线程跑不满多核
CPU密集与I/O密集任务下多线程加速比的真实对比实测。
并发
解释器内部
动画演示