后端基础
记录时间:2026-10-18
阅读约 4 分钟
Java 集合框架中 HashMap 扩容机制与哈希冲突学习笔记
温习 JDK 标准库中 HashMap 的底层数组加链表与红黑树结构,梳理为什么容量始终保持为 2 的幂次方,以及高低位掩码在扩容迁移中的巧妙应用。
1. 为什么容量设计为 2 的幂次方
当数组长度为 2 的 n 次幂时,计算元素下标的取模运算 hash % length 可以等价转化为位与运算 (length - 1) & hash,大幅提升了散列定位的执行效率。
2. 扰动函数的作用
为了降低哈希碰撞概率,HashMap 将键值的原始 hashCode 高 16 位与低 16 位进行异或运算,使高位特征也能参与到寻址运算中:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
3. 链表转红黑树的双阈值条件
日常复习容易忽略的一点:并非单个桶位链表长度达到 8 就立即树化,而是同时检查当前数组总容量是否达到 64(MIN_TREEIFY_CAPACITY)。若容量不足 64,优先执行 resize() 扩容而非树化。
数据库
记录时间:2026-10-21
阅读约 5 分钟
MySQL InnoDB 索引结构与最左前缀匹配原则梳理
整理关系型数据库中 B+ 树聚簇索引与二级索引的查询路径差异,总结日常编写 SQL 查询语句时如何利用覆盖索引减少回表开销。
1. 聚簇索引与二级索引的区别
在 InnoDB 存储引擎中,主键索引(聚簇索引)的叶子节点直接存放整行数据记录;而普通二级索引的叶子节点存放的是主键值。当通过二级索引查询未包含在索引列中的字段时,需要根据主键值再次回到聚簇索引查找,即“回表”。
2. 联合索引与覆盖索引优化
建立联合索引 idx_status_created (status, created_at) 后,查询条件遵循最左前缀原则:
-- 命中联合索引且利用索引有序性避免额外文件排序 (Using index condition)
SELECT id, status, created_at
FROM study_record
WHERE status = 1
ORDER BY created_at DESC
LIMIT 20;
在日常开发中,避免盲目使用 SELECT *,按需指明查询列可以显著提高覆盖索引命中率。
前端笔记
记录时间:2026-10-25
阅读约 3 分钟
现代 CSS Grid 与 Flexbox 响应式排版日常随笔
对比一维弹性盒模型(Flexbox)与二维网格布局(Grid)的适用边界,记录常见自适应卡片流与粘性页脚的简洁实现方式。
1. 一维与二维布局的分工
导航栏、按钮组等单行或单列对齐场景优先采用 Flexbox;而整体页面骨架或等高多列卡片矩阵,使用 CSS Grid 的 repeat(auto-fill, minmax(...)) 可以免去繁琐的媒体查询断点:
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 20px;
}
2. 保持视觉呼吸感与留白
良好的阅读体验依赖克制的字号层级与行高设定。正文行高保持在 1.7 ~ 1.8 之间,单行阅读宽度控制在 60~75 个字符以内,能有效减轻长文阅读疲劳。
后端基础
记录时间:2026-10-28
阅读约 4 分钟
Linux 常用日志排查与文本流处理命令温习记录
汇总日常在服务器终端查阅应用运行状态、定位异常堆栈与统计接口耗时的常用命令组合,提升日常学习与排障效率。
1. 实时追踪与上下文检索
排查错误日志时,仅看匹配行往往不够,结合 grep -C 可以同时输出匹配行前后的上下文堆栈:
# 检索包含 Exception 的日志行,并打印前后各 10 行上下文
grep -n -C 10 "Exception" app.log | tail -n 50
2. 端口与进程占用核查
使用 ss -tulpn 替代老旧的 netstat 命令,能够更快速直观地查看当前监听的 TCP/UDP 端口与对应进程 PID。