知其然,知其所以然
Java 内部原理 2026-07-31

Cleaner API 真实验证:替代 finalize() 的资源清理兜底机制

真实验证Cleaner注册的清理动作在手动调用Cleanable.clean()时真实立刻执行;真实验证重复调用clean()真实幂等;真实验证忘记手动清理、对象失去强引用后,触发System.gc()并等待,Cleaner后台线程真实会自动执行注册好的清理动作。

Java Cleaner GC 动画演示
Java 内部原理 2026-07-30

方法引用四种形式真实验证:和lambda底层都是同一套 invokedynamic 机制

真实验证方法引用的四种写法都能正确工作,且和等价lambda表达式计算结果完全一致;真实用getClass().getName()验证方法引用和lambda在运行时生成的类名真实都带有Lambda字样,证明两者共享同一套invokedynamic+LambdaMetafactory机制。

Java 方法引用 lambda 动画演示
Java 内部原理 2026-07-29

双亲委派真实验证:自定义ClassLoader真实无法覆盖java.lang.String

真实用自定义ClassLoader去loadClass(java.lang.String),真实拿到的还是Bootstrap ClassLoader加载的官方String类;真实进一步用defineClass()尝试把自己的字节码强行注册成java.lang.String,真实被JVM安全机制拦下,抛出SecurityException。

Java 类加载器 双亲委派 动画演示
Java 内部原理 2026-07-28

数组的 hashCode()/equals() 真实验证:基于身份,不是基于内容

真实验证两个内容完全相同的int[]数组,直接equals()真实认为不相等,hashCode()真实也不同;真实验证Arrays.equals()和Arrays.hashCode()才是基于内容的版本;真实验证Arrays.equals()对二维数组只比较内层引用,必须用deepEquals()才够深。

Java 数组 equals 动画演示
Java 内部原理 2026-07-27

hashCode() 契约真实验证:只重写equals不重写hashCode,HashSet真实存进两份"重复"元素

真实用只重写equals()不重写hashCode()的类做key,真实验证两个equals()相等的对象hashCode()真实不同;真实验证用等价对象去HashMap.get()真实查不到值;真实验证HashSet真实把两个equals()相等的对象当成不同元素各存一份。

Java hashCode 契约 动画演示
Java 内部原理 2026-07-26

equals() 契约真实验证:对称性被打破后,List.contains() 真实给出矛盾答案

真实构造一个违反对称性的equals实现,真实验证cis.equals(s)和s.equals(cis)给出不同结果,进而真实导致List.contains()因参数顺序不同给出矛盾答案;真实复现经典的Point/ColorPoint传递性问题:p1=cp1、p1=cp2,但cp1≠cp2。

Java equals 契约 动画演示
Java 内部原理 2026-07-25

数组 clone() 真实验证:二维数组只深拷贝第一层

真实验证一维基本类型数组的clone()是完整的值拷贝;真实验证一维对象数组的clone()只拷贝元素引用;真实验证二维数组的clone()只深拷贝了最外层,内层数组依然真实是共享引用,必须手动逐行clone()才能得到真正独立的二维数组。

Java 数组 clone 动画演示
Java 内部原理 2026-07-24

this 逃逸真实验证:200轮测试全部看到未初始化完成的对象状态

真实在构造函数里把this赋给一个静态字段发布出去,真实起观察者线程自旋等待这个字段非null后立即读取一个未加volatile的字段,200轮真实测试全部200次都读到了默认值0;真实对照安全发布方式,200轮测试真实零次看到未初始化状态。

Java 并发 内存可见性 动画演示
Java 内部原理 2026-07-23

静态初始化顺序真实验证:父类静态块永远先于子类,只执行一次

真实记录 Parent/Child 两层继承链创建两个实例的完整14步真实执行顺序:静态代码块和静态字段初始化真实只在类第一次被使用时执行一次,且父类的静态初始化真实永远先于子类;实例初始化块和构造器真实每次new都会重新执行一遍。

Java 类加载 初始化 动画演示
Java 内部原理 2026-07-22

字段隐藏真实验证:字段访问没有多态,方法调用才有

真实验证同一个Dog对象,用Animal引用和Dog引用分别访问同名字段type,得到真实不同的结果;但调用同名方法getType()两个引用真实得到相同结果;真实用反射证明父类和子类同名字段是两个完全独立的Field对象,不是被覆盖。

Java 多态 继承 动画演示
Java 内部原理 2026-07-21

异常链真实验证:getCause() 和 initCause() 的真实约束

真实验证用构造器传入cause包装异常后,e.getCause()真实拿到原始异常;真实验证initCause()事后设置cause的效果和构造器传入完全一致,但真实只能调用一次,第二次调用会真实抛出IllegalStateException;真实验证printStackTrace()的Caused by:标记。

Java 异常 异常链 动画演示
Java 内部原理 2026-07-20

switch 穿透真实复现:忘记 break 导致的静默逻辑 bug

真实复现忘记写break导致case穿透:case 1 真实执行了case 1和case 2两段代码,没有任何编译错误也没有运行时异常;真实验证case穿透合法用法;真实验证switch匹配失败时会直接跳到default标签开始执行,不会经过前面任何case。

Java switch 陷阱 动画演示
京ICP备2026067502号-1京公网安备11010502063487号