今天的练习
周四,三轮九问,全部答对零瑕疵——这是开始每天练习以来最干净的一天。上午 Java 考 final/finally/finalize 三兄弟,下午前端考生命周期与三种隐藏方式,收工前数据库考 WHERE/HAVING 和隔离性三大问题。晚上一复盘,发现好几个点都是以前踩过的坑的亲戚,二刷的复利开始显现了。
题目一:final / finally / finalize 三兄弟
final 能修饰什么?finally 保证什么、有没有不执行的情况?final、finally、finalize 分别是什么?
我的第一版回答:final 修饰类表示不能被继承,修饰方法表示不能被重写,修改变量就无法重新赋值,总之就是"最终状态,无法被修改"。finally 用在 try-catch-finally 里释放资源(如数据库连接),保证 try 正常结束、catch 捕获、或 return/throw 之后必定执行。不执行的情况:try 死循环、程序被退出、守护线程里的 try。finalize 是 Object 的方法,用来清理资源,已废弃。
复盘
- 三兄弟区分全对:final 修饰符 / finally 代码块 / finalize 方法,性质完全不同,横向对比意识很好。
- 守护线程表述不精确:准确说是守护线程在 JVM 退出时来不及执行 finally。面试标准三答案:System.exit()、JVM 崩溃(OOM)、死循环卡死。
- 补充大考点:finally 里的 return 会覆盖 try 里的 return——
try { return 1; } finally { return 2; }结果是 2,面试官爱考。 - final 引用变量 ≠ 内容不可变:
final List照样能 add,锁的是引用不是对象内部。
一句话记住
final 锁死不许改,finally 兜底必须跑,finalize 是 GC 时代的遗物(JDK 9 起废弃)。
题目二:created 和 mounted 的区别
created 和 mounted 有什么区别?各自适合做什么?
我的第一版回答:created 时机是 Vue 创建实例完成,但页面 DOM 还没生成,拿不到 DOM 元素,适合发请求拿数据。mounted 是挂载后,组件 DOM 已经完成初始化挂载到页面,可以操作 DOM 了,像 ECharts 初始化就是这个时候。
复盘
- 全对。时序、DOM 可用性、场景(请求 vs ECharts)都答准了。
- 加分考虑:created 发请求如果组件已销毁(用户快速切走),数据回来赋值会警告。更稳的是配合取消机制,面试能说出这层就很加分。
- 钩子顺序:created → beforeMount → mounted,中间还隔着一层。
一句话记住
created 在 DOM 出生前(发请求),mounted 在 DOM 落地后(操作 DOM、初始化图表)。
题目三:JS 基本类型,null 和 undefined 的坑
JS 有哪些基本数据类型?null 和 undefined 有什么区别?
我的第一版回答:基本类型 7 种——string、number、boolean、null、undefined、symbol(ES6 加的)、bigint;还有引用类型 object。undefined 是变量未定义(let a 后打印就是 undefined),null 是空值,一般是开发者手动给的。有个大坑:用 == 判断 null 和 undefined 会返回 true,要用 ===。
复盘
- 全对。7 + 1 的分类、两者区别、== 的坑都答了。
- 补两个高频追问:
typeof null === 'object'是历史遗留 bug;判断真对象的可靠方式是Object.prototype.toString.call(x)。 - 隐藏细节:typeof 对 function 返回 'function',但它其实是 object 的子类型。
一句话记住
undefined 是系统说"没给值",null 是开发者说"故意给空";两者 == 成立但 === 不成立。
题目四:三种"看不见"的 CSS 方式
display:none、visibility:hidden、opacity:0 都能让元素看不见,三者有什么区别?
我的第一版回答:display:none 不占位置不能点击,直接脱离文档流不渲染了;visibility:hidden 占位置不能点,元素被隐藏了但还在文档里;opacity:0 占位置也能点,只是元素透明了。
复盘
- 全对。占位/点击两个维度分得清清楚楚,opacity:0 能点这个很多人记反,答对了。
- 冷知识:visibility 可继承,父元素 hidden 后子元素设
visibility: visible能重新显示;display:none 整个子树都没了。面试问"隐藏容器里怎么让某个子元素显示"答案就是它。
一句话记住
none 连位置都不给,hidden 占着位置不给点,opacity 全透明但一切照旧。
题目五:WHERE 和 HAVING
WHERE 和 HAVING 都能筛选,有什么区别?
我的第一版回答:WHERE 是在分组前过滤原始行,执行顺序在 GROUP BY 和 HAVING 之前;HAVING 是对分组后过滤分组结果,可以用聚合函数,而且必须跟 GROUP BY 组合使用。
复盘
- 全对。分组前后、聚合函数可用性、执行顺序都答了。
- 补全链路:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT,这个顺序背下来很多 SQL 性能问题的排查就通了。
一句话记住
WHERE 先筛行,HAVING 后筛组;聚合函数只认 HAVING。
题目六:脏读、不可重复读、幻读
脏读、不可重复读、幻读分别是什么意思?
我的第一版回答:脏读是事务 A 读到了事务 B 还没提交的数据,B 回滚 A 读的就是垃圾。不可重复读是同一事务两次读取同一行,中间被别的事务修改,两次结果不一样。幻读是两次查询中间被别的事务改了符合条件的行,两次结果行数不一样。
复盘
- 全对。三个定义各带例子,区分度清楚:脏读看"提交没提交",不可重复读看"同一行的值",幻读看"行数变化"。
- 隔离级别对应关系补上:脏读 → READ COMMITTED 解决;不可重复读 → REPEATABLE READ 解决(MySQL InnoDB 默认);幻读 → MVCC + 间隙锁(Next-Key Lock)。
一句话记住
脏读读到别人没提交的,不可重复读同一行变味,幻读行数会变多。
题目七:GET 和 POST
GET 和 POST 有什么区别?
我的第一版回答:GET 一般用来获取资源,参数放在 URL 的 ? 后面,幂等,但暴露在 URL 里会被浏览器缓存,不安全。POST 一般提交数据,参数在请求体里,非幂等,安全性高,body 大小看服务器有没有限制,理论上无限制,不被缓存。
复盘
- 全对。用途、参数位置、幂等性、缓存行为都答了。
- 精确化:"GET 不安全"准确说是敏感数据不该放 URL——会进浏览器历史、服务器日志、Referer。HTTPS 下 GET 和 POST 一样加密,协议本身没有安全等级之分。
- 面试加分:语义 vs 实现——POST 不保证安全,安全靠 HTTPS + 服务端校验;GET 也能带 body(没人用),POST 也能幂等(服务端自己实现)。
一句话记住
GET 问服务器要资源、参数在 URL、幂等可缓存;POST 给服务器交数据、参数在 body、不幂等。
连续三轮全对的那天,往往不是运气——是前几天的坑都变成了今天的肌肉记忆。
今天九问全对,最大感受是二刷的复利:8/28 学的 const 不可变今天用在 final 上,8/31 学的 null/NaN 今天接上 typeof null,9/1 学的 GET/POST 今天补全了语义层。错过的题记下来再考一遍,比刷新题有用得多。明天 Java 继续加码,数据库上 EXPLAIN。