第 3 章 从 Java 到 Kotlin:设计哲学、演进史与迁移决策
本章目标理解 Kotlin 为什么存在——它不是"更好的 Java",而是一次有明确取舍的重设计;掌握 Kotlin 与 Java 的 30+ 条语义差异,以及每条差异背后的 JVM 代价;看懂 Kotlin 的演进史,从而能读懂任何一个新特性的"来路";获得一套可执行的迁移决策
第 5 章 工具链与工程骨架:把实验环境固化成基础设施
本章目标搭一个能撑住全书 45 章实验的 Gradle 9 多模块工程;彻底搞清楚jvmToolchain/jvmTarget/--release三者的区别(90% 的人搞混);建立四套工作流:反编译对照、字节码检查、JMH 基准、静态检查;掌握 Gradle 构建性能优化的正确
面试官让讲equals和hashCode的约定,我从HashMap扩容讲到他点头
前年跳槽的时候碰到一个面试官,开场就问「equals 和 hashCode 有什么约定」。这题我心里咯噔一下,不是因为难,是因为太基础了,基础到你随便答两句就会被归到「背八股的」那一档。
彻底搞懂equals和hashCode!底层原理+重写规范
只要你写Java代码,equals() 和 hashCode() 是永远绕不开的两个方法。无论是日常开发去重、对象比对、集合存储,还是面试高频八股提问,这一对方法都是重中之重。
只重写 equals,你的 HashMap 就废了
有一个 bug 特别典型:代码里往 Map 里放了一个对象,然后拿一个"看起来一样"的对象去取,取出来是 null。你打开调试,看到两个对象的字段完全一致,equals 也返回 true,但 get 就是拿不到。这个现象的原因几乎总是同一个:重写了相等判断,但没重写哈希计算。
String 为什么设计成不可变,追问到字符串常量池我才算讲透
上个月陪一个准备跳槽的兄弟做模拟面试,我扮演面试官,第一个问题就是 String 为什么不可变。他脱口而出:「因为类是 final 的,里面的数组也是 final 的。」我追了一句:「final 修饰数组,锁住的是引用还是内容?」他愣了三秒。这一愣基本就暴露了,答案是背的。