Java 25 只需一条命令和一个光秃秃的 void main 就能运行单个源文件,不用先写类。了解 JDK 里有什么、为什么选 Java 25,以及怎样读懂编译错误和异常。
Java 变量里存的要么是基本类型的值,要么是指向对象的引用。分清这一点,就能看懂静默溢出、按值传递、== 与 equals 的区别,以及两个存着 128 的 Integer 为什么不相等。
Java 的 if 和循环看起来和 C 一样,但有几条规则能拦住真实的 bug。旧 switch 默认会贯穿,switch 表达式修掉了这个问题,还让编译器检查每个枚举值。
Java 类描述对象持有哪些数据、能做什么,构造器决定每个对象怎样开始。通过运行小程序,学会字段、this、构造器、private、static 和 final。
Java 字符串创建后就不会再变,每次“修改”都会生成新字符串。本文讲 String 常用方法及其陷阱、循环里的 += 为什么要复制全部内容、StringBuilder、文本块、Unicode,以及数组和 Arrays 工具类。
Java record 用一行声明一个不可变的小数据类,编译器替你写好构造器、访问器、equals、hashCode 和 toString。看看 record 给了你什么、拒绝做什么,又在哪里力不从心。
接口说明一个类型能做什么,继承把父类的一切交给子类,组合则把另一个对象包装起来。通过运行小程序,学会默认方法、super、抽象类,并看清脆弱基类陷阱。
密封类型给 Java 一份封闭的子类型清单,模式匹配让 switch 逐个检查并拆开每一种子类型。两者结合,漏掉的 case 会变成编译错误,而不是悄无声息的 bug。
Java 把异常分成两类:编译器强制你处理的受检异常,和不强制的非受检异常。学会 try、catch 和 finally,学会恰当地抛出和包装异常,再看 try-with-resources 如何按相反顺序关闭资源。
Java 的 HashMap 靠 hashCode 和 equals 查找键,约定被破坏或键在 put 之后被修改,条目就会“消失”。本文讲清这些规则、TreeSet 为什么改用 compareTo,以及该选哪种集合。
泛型让编译器检查放进列表、盒子或方法里的是什么,然后在程序运行前把这些信息擦除。通过运行小程序,学会上下界、通配符、PECS,以及怎样读懂 JDK 的方法签名。
Java 的 lambda 表达式把一小段行为变成值,流再把它们串成惰性的流水线。看看流水线到底怎样运行、该用哪些收集器,以及什么时候普通循环更好读。
Java 允许任何引用为 null,缺失的值可能在远离源头的地方让代码崩溃。Objects 和 Optional 让缺失变得看得见,java.time 则要你说清是哪个时刻、在哪座城市。
只用 javac、jar 和 java 搭一个双模块 Java 项目。看清包、导入、类路径、JAR 文件和 module-info.java 怎样配合,以及 Maven 和 Gradle 在此之上又多做了什么。
Java 把变量和对象放在哪里,垃圾回收器怎样决定释放什么,有垃圾回收的程序为什么照样会内存泄漏、内存耗尽,以及 JIT 为什么让代码越跑越快。
两个 Java 线程修改同一个变量,写入可能悄无声息地丢失。看清 count++ 为什么会竞态,synchronized、volatile、原子类和锁怎样修好它,以及怎样强制制造并检测死锁。
Java 执行器用固定的线程池运行任务,并交回一个 Future。学会 submit、invokeAll、取消、CompletableFuture 链、超时、信号量和阻塞队列,每个示例的输出都稳定不变。
Java 能在少量操作系统线程上跑十万个阻塞任务。看懂虚拟线程怎样挂载和卸载、什么情况下仍会被固定、ScopedValue 为什么能取代 ThreadLocal,以及 StructuredTaskScope 怎样取消失败的工作。
不用任何库,JDK 就能发起 HTTP 请求,也能提供 HTTP 服务。学会 HttpClient 的同步和异步用法,再用内置的 HttpServer 和虚拟线程搭一个小型 JSON 任务服务,状态码正确,关闭干净。
只用 JDK,靠一个注解加反射写出小型测试运行器,用 –patch-module 测试包私有代码,再把 Java 服务发布成模块化 JAR、jlink 运行时镜像和 jpackage 安装包。