# 1. CompletableFuture 链中的 CompletionException 应在哪一层解包,才能避免重复包装和错误重试 A 应在链的最外层边界统一解包一次,避免重复包装和错误重试 ✓ 正确答案 B 每个中间阶段都应调用 get() 并解包,以尽早暴露异常 C CompletionException 永远不会产生新的分配,解包成本可忽略 D 只要捕获了 CompletionException 就说明原异常已丢失,无法恢复 cause
# 2. JVM 如何对异常做栈展开(Stack Unwinding)的成本 A 每个 try/catch 都会在正常路径上产生显著的栈遍历开销 B 异常表只在解释执行时生效,JIT 编译后不再使用 C 栈展开只发生在当前方法内,不会跨方法传播 D JVM 用异常表精确匹配,正常执行 try 块几乎零成本,抛异常本身才昂贵 ✓ 正确答案
# 3. JVM 异常表(Exception Table)的字节码原理 A 异常表运行期动态生成,随异常类型变化 B 异常表只支持精确异常类型匹配,不支持子类 C finally 块不会出现在异常表中,只能靠 finally 字节码指令 D 异常表每条记录含 start/end/handler 字节码偏移与 catch_type,try/finally 会被编译成多条异常条目 ✓ 正确答案
# 4. OutOfMemoryError 在 G1 与 ZGC 下的堆转储(Heap Dump)触发行为与捕获建议 A ZGC 永远不会抛出 OutOfMemoryError B G1 与 ZGC 的堆转储格式完全不同,无法用同一工具分析 C -XX:+HeapDumpOnOutOfMemoryError 会生成 hprof 文件供诊断,OOM 本身不可恢复,主打快速退出保留现场 ✓ 正确答案 D 捕获 OOM 后清理局部变量即可安全恢复程序
# 5. Spring Boot 4.0 如何用 ProblemDetail 统一映射领域异常,同时区分客户端错误与服务端故障 A 使用 @ControllerAdvice 后必须用 ErrorResponse 替代 ProblemDetail B ProblemDetail 只能返回 500,无法表达 4xx C ProblemDetail 是 Spring 自定义私有格式,不符合任何标准 D 客户端错误映射 4xx、服务端故障映射 5xx,通过 status 与稳定错误码区分并避免泄露内部细节 ✓ 正确答案
# 6. String 不可变性的设计意义与 JIT 优化(String Constant Pool) A String 可变时哈希缓存也能正确工作,不可变性只是习惯 B 字符串常量池只存在于 JDK 6 及更早版本 C 不可变性带来线程安全、哈希缓存、常量池复用等优化基础,字面量相同内容在常量池中复用 ✓ 正确答案 D new String("x") 与字面量 "x" 总是引用同一对象
# 7. Unicode 与 UTF-16 在 JVM 中的字符存储(char/code point) A char 就是 Unicode 码点,一个字符总是一个 char B JVM 内部用 UTF-8 存储所有字符 C 所有 Unicode 字符都恰好占 16 位 D char 是 UTF-16 code unit,补充平面字符需两个 char 组成代理对,length() 与码点数可能不同 ✓ 正确答案
# 8. hashCode 与 equals 契约的细节、违反契约时集合行为 A equals 相等时 hashCode 必须相等,但 hashCode 相等时 equals 不必相等 ✓ 正确答案 B 可变对象作键是安全的,因为集合会重算哈希 C 只需实现 equals,hashCode 可任意返回常量 D 违反契约只影响效率,不影响正确性
# 9. 在 finally 中抛出异常的覆盖与栈丢失 A finally 抛出的异常会覆盖 try 的原始异常导致栈丢失,try-with-resources 用 addSuppressed 保留 ✓ 正确答案 B finally 抛出的异常会被忽略,不影响原始异常 C finally 中 return 与抛异常等价 D 原始异常总是以 cause 形式保存在 finally 异常中
# 10. 基本类型与包装类的差异、自动装箱拆箱的缓存范围与坑点 A Integer/Long 缓存 -128~127,范围内 == 相等、范围外不等,应使用 equals 比较 ✓ 正确答案 B 所有 Integer 值 == 比较都相等 C 自动拆箱永远不会抛 NPE D 包装类与基本类型性能完全相同
# 11. 基本类型包装类的缓存范围(IntegerCache)在不同 JDK 版本下默认值与可配置边界如何 A 所有包装类缓存范围都可配置 B Integer 缓存默认 -128~127,可用 -XX:AutoBoxCacheMax 提升上限,Long 固定 -128~127 不可配置 ✓ 正确答案 C Integer 缓存范围是 -128~127 且永远不可改 D 缓存范围只影响性能不影响 == 比较
# 12. 字符串拼接 + 与 StringBuilder/StringConcatFactory 的性能边界 A 循环内 str += x 会被编译器优化为高效拼接 B 单条语句多处 + 可被编译优化(StringBuilder/StringConcatFactory),但循环内累积拼接应改用 StringBuilder 避免 O(n²) ✓ 正确答案 C 使用 StringBuilder 永远比 + 慢 D JDK 9 后 + 拼接在循环内也总是 O(n)
# 13. 自定义异常的命名、序列化与栈快照成本 A 异常栈快照总是免费生成的 B 自定义异常必须继承 RuntimeException C 自定义异常不应有构造器 D 命名以 Exception 结尾、透传 cause、声明 serialVersionUID,热路径可禁用栈快照节省成本 ✓ 正确答案
# 14. 虚拟线程执行的并发子任务分别失败时,调用方应如何聚合异常、传播取消并保留诊断上下文 A 虚拟线程会复用线程池线程,MDC 自动跨子任务继承 B 子任务失败后其他子任务必须继续运行无法取消 C StructuredTaskScope 可统一生命周期、聚合异常并传播取消,诊断上下文需显式传递或复制 ✓ 正确答案 D 虚拟线程无法并发执行多个任务
# 15. 远程调用超时、连接失败和业务拒绝应如何分类,才能制定不同的幂等重试与熔断策略 A 所有异常都应无条件重试 B 业务拒绝也应激进重试以提升成功率 C 熔断只与错误码有关,与重试无关 D 可重试瞬态故障(超时/连接失败)用退避+幂等重试,业务拒绝(4xx)不重试,连续失败触发熔断 ✓ 正确答案
# 16. 频繁调用 Throwable.fillInStackTrace 会带来哪些分配与栈遍历成本,何时可采用无栈异常 A fillInStackTrace 是免费的,无分配 B 无栈异常永远比有栈异常耗时 C 栈快照需遍历栈帧并分配 StackTraceElement,热路径可重写 fillInStackTrace 返回 this 形成无栈异常 ✓ 正确答案 D 无栈异常仍保留完整栈信息
# 17. == 与 equals 在基本类型、引用类型与包装类上的语义差异 A == 对基本类型比值、对引用类型比引用,equals 默认也是引用比较、重写后才是值比较 ✓ 正确答案 B == 对基本类型比较引用,对引用类型才比较值 C equals 用于基本类型比较,因为基本类型也有 equals 方法 D 包装类 == 总是等于值比较,与缓存无关
# 18. @SneakyThrows(Lombok)与隐性异常的代价 A 它把受检异常转成非受检异常,但不会从字节码层面绕过编译器 B 它只影响运行时性能,不影响语义 C 它通过编译期改写绕过受检异常检查,代价是调用方看不到异常契约、异常被隐式传播 ✓ 正确答案 D 它是 JDK 标准注解,与 Lombok 无关
# 19. AssertionError 的使用场景与生产开关 A 断言生产默认开启,适合做参数校验 B assert 抛 AssertionError,生产默认关闭(-da),适合开发期不变量校验而非运行时参数校验 ✓ 正确答案 C assert 失败不会抛任何异常 D AssertionError 是受检异常
# 20. Checked Exception 与 Unchecked Exception 的设计争议 A 受检异常总是优于非受检异常 B 非受检异常也会被编译器强制检查 C 所有异常都应声明为受检 D 受检异常强制处理但常引入样板代码并与 Stream 不兼容,现代实践倾向对调用方无法恢复的场景用非受检异常 ✓ 正确答案
# 21. Error 与 OutOfMemoryError 的处理策略(不可恢复边界) A OOM 属于不可恢复边界,应保留现场并快速失败退出,由编排层重启,重点是预防 ✓ 正确答案 B OOM 可以安全地捕获后恢复 C StackOverflowError 是必选可恢复的 D Error 与 Exception 处理策略完全相同
# 22. Helpful NPE 在链式调用(a.getB().getC())中的空值定位精度与性能开销 A 它通过分析字节码在链式调用中精确定位哪个环节为 null,开销主要在异常路径、正常路径无影响 ✓ 正确答案 B Helpful NPE 会改变 NPE 的可捕获语义 C Helpful NPE 永远开启且无任何开销 D 它只能定位基本类型空值
# 23. Java 14 Helpful NullPointerException(JEP 358)的空值链定位信息与 -XX:+ShowCodeDetailsInExceptionMessages A 它报告 NPE 并给出表达式级空值定位,由 -XX:+ShowCodeDetailsInExceptionMessages 控制(JDK 15 起默认开启) ✓ 正确答案 B 它只能报告行号,无法定位链上环节 C 该特性默认关闭且只能手动开启 D 它会吞掉 NPE 不让它抛出
# 24. Java 17 密封接口与 JDK 21 模式匹配的穷尽性检查 A sealed 接口允许任意外部子类 B sealed 用 permits 封闭子类型集,switch 覆盖全部子类型时编译器判定穷尽、遗漏则编译报错 ✓ 正确答案 C default 分支在穷尽 switch 中必须存在 D 穷尽性检查只在运行时进行
# 25. Java 7+ 多 catch(multi-catch)与类型推断 A multi-catch 只支持一个异常类型 B multi-catch 可以捕获有继承关系的异常类型 C multi-catch 变量可以重新赋值 D multi-catch 合并多个不相关异常,变量类型是其共同父类型,且类型间不能有继承关系 ✓ 正确答案
# 26. Java 8 接口默认方法的菱形继承与冲突解决 A 冲突时默认取第一个接口的实现 B 类方法优先于默认方法,无法区分时需显式用 X.super.m() 解决 ✓ 正确答案 C 所有默认方法冲突都会编译失败 D 默认方法不存在冲突问题
# 27. Java 8/11/17/21/25 各版本新增的语言特性对日常编码的影响 A Java 8 引入 record,Java 21 引入 Lambda B 所有新特性都只在最后一个版本提供 C Java 8 引入 Lambda/Stream,Java 16 定稿 record,Java 21 定稿 switch 模式匹配与 record pattern,Java 25 引入更多新特性 ✓ 正确答案 D 语言特性不影响编码风格
# 28. Java 关键字 yield 在 switch 表达式中的作用 A yield 会退出整个方法 B yield 与 return 完全等价 C yield 用于 switch 表达式块语法分支中返回结果,箭头语法直接用表达式,无需 yield ✓ 正确答案 D yield 只能用于 switch 语句而非表达式
# 29. Java 内部类(成员/局部/匿名/静态内部类)的语义差异 A 所有内部类都不允许访问外部私有成员 B 静态内部类也持有外部实例引用 C 非静态内部类(成员/局部/匿名)隐式持有外部实例引用,静态嵌套类不持有,可独立实例化 ✓ 正确答案 D 匿名内部类不能捕获局部变量
# 30. Java 协变返回类型(Covariant Return Type) A 子类覆写方法返回类型必须与父类完全相同 B 协变返回类型会降低类型安全 C 协变返回类型只适用于泛型 D 子类覆写时可返回父类返回类型的子类型,编译器用桥接方法兼容字节码签名 ✓ 正确答案
# 31. Java 异常的层次结构(Throwable/Error/Exception/RuntimeException) A Error 是受检异常,必须处理 B Throwable 的子类只有 Exception C RuntimeException 及其子类为未受检异常,Error 也是未受检,其余 Exception 为受检异常 ✓ 正确答案 D 所有异常都是受检异常
# 32. Java 数值类型的提升规则与溢出陷阱 A int 溢出会抛 ArithmeticException B byte+byte 结果仍是 byte C long 与 int 混合运算结果总是 int D 数值提升会把 byte/short 提升为 int,int 运算溢出静默回绕,需用 Math.addExact 或 long 运算规避 ✓ 正确答案
# 33. Java 继承与组合的取舍,里氏替换原则的实际违反场景 A 任何继承都合法 B 组合一定比继承差 C LSP 只与接口有关,与继承无关 D 继承代表 is-a,子类须能替换父类(LSP);仅复用代码时用组合,子类破坏父类契约即违反 LSP ✓ 正确答案
# 34. Lambda 中的 checked exception 包装策略 A Lambda 可以直接抛出受检异常 B 标准函数式接口不声明受检异常,需包装成 RuntimeException 或使用自定义 Throwing 函数式接口 ✓ 正确答案 C 受检异常在 Lambda 中会被自动忽略 D 只有 Consumer 能抛受检异常
# 35. _(Underscore)在 Java 8/9 前后的语义变化 A Java 8 和 Java 9 中 _ 都是合法变量名 B Java 8 中 _ 是合法标识符,Java 9 起成为关键字,不能用作标识符 ✓ 正确答案 C _ 在任何版本都不能用 D Java 9 起 _ 可以随意用作类名
# 36. clone() 的浅拷贝、深拷贝与替代方案(拷贝构造器/工厂) A clone() 需实现 Cloneable 且默认浅拷贝,深拷贝需手动实现,推荐用拷贝构造器/工厂替代 ✓ 正确答案 B clone() 会调用构造器 C clone() 不需要处理异常 D clone() 默认总是深拷贝
# 37. enum 的进阶用法(抽象方法、EnumSet/EnumMap、valueOf 边界) A EnumMap 用位图实现,EnumSet 用数组实现 B enum 可定义抽象方法让每个常量实现不同行为,EnumSet/EnumMap 用位图/数组高效存储,valueOf 按名称查找 ✓ 正确答案 C valueOf 使用 ordinal 查找 D enum 不能有构造器
# 38. final 字段的安全发布(Safe Publication)保证 A final 字段读到的值可能被重排序影响 B final 字段与 volatile 完全相同 C final 字段保证构造器写入的最终值在其他线程可见且不受重排序影响,但引用本身仍需正确发布 ✓ 正确答案 D final 字段只能继承不能赋值
# 39. instanceof 模式匹配(JEP 394/420)与 switch 模式匹配的演进 A instanceof 模式匹配在 Java 16 定稿,避免强转;switch 模式匹配在 Java 21 定稿,支持类型模式与穷尽性 ✓ 正确答案 B switch 模式匹配在 Java 8 已可用 C 模式匹配只能用于基本类型 D instanceof 模式匹配不能减少强转
# 40. null 对象模式与 Optional 的取舍 A null 对象模式提供空实现让调用安全,Optional 显式表达"可能为空的值"适合返回值链式处理,二者可结合 ✓ 正确答案 B Optional 适合作为字段 C null 对象模式不能实现接口 D 两者完全等价
# 41. 参数校验的快速失败,Objects.requireNonNull/requireNonNullElse 与参数对象自校验(Bean Validation)在异常类型选择上的边界 A 所有校验失败都应抛 NPE B null 检查用 Objects.requireNonNull(NPE),非法值/约束用 IllegalArgumentException 或 Bean Validation,区分"null"与"非法值" ✓ 正确答案 C Bean Validation 也抛 NPE D 参数校验不应 fail-fast
# 42. package-info.java 与包级注解的应用 A 它只能声明包名,不能放注解 B 它是普通类 C 它用于声明包级注解与包级文档,注解可作用于整个包(ElementType.PACKAGE) ✓ 正确答案 D 包级注解只能在类上
# 43. super 在泛型与构造中的访问限制 A super(...) 只能出现在构造器最后一行 B super 可以在静态方法中使用 C super(...) 必须出现在构造器第一行,且与关键字 super 相区别,泛型中的 ? super T 是下界通配符 ✓ 正确答案 D super 关键字与泛型 super 通配符是同一概念
# 44. switch 表达式箭头语法(yield)与穷尽性检查(exhaustive switch)在 sealed 接口上的应用 A 箭头语法支持 yield 返回值,sealed 接口的 switch 覆盖全部子类型时视为穷尽、遗漏则编译报错 ✓ 正确答案 B 穷尽 switch 必须带 default C 穷尽性检查只在运行时进行 D sealed 接口无需穷尽性检查
# 45. try-with-resources 的实现原理与资源关闭顺序 A 资源必须是 Cloneable B try-with-resources 声明多个资源时按声明顺序关闭 C 多个资源按逆序关闭,close 异常作为 suppressed 附加到主异常,避免覆盖 ✓ 正确答案 D 关闭异常会覆盖主异常
# 46. var 局部变量类型推断的边界(不能用于字段/方法签名) A var 可用于字段与方法返回类型 B var 可以用于 lambda 参数 C var 是动态类型,运行时才确定 D var 只能用于局部变量,不能用于字段/参数/返回类型,且类型是编译期静态推断 ✓ 正确答案
# 47. 不可变对象的构造策略与防御性拷贝 A 不可变对象可以暴露可变内部引用 B 防御性拷贝会破坏不可变性 C record 一定是深不可变的 D 不可变对象用 final 字段、无 setter,构造和访问时对可变引用做防御性拷贝以隔离外部修改 ✓ 正确答案
# 48. 原始类型、原始类型包装与 Number 子类的关系 A 所有包装类都是 Number 子类 B 数值包装类(Integer/Long 等)继承 Number 提供统一数值转换,Character/Boolean 不是 Number 子类 ✓ 正确答案 C 包装类与原始类型在泛型中可互换使用 D Character 是 Number 子类
# 49. 发生 OutOfMemoryError 后为什么不应依赖常规 catch 恢复,进程退出前可安全执行哪些最小动作 A OOM 后可以继续正常运行 B catch 住 OOM 后清理内存即可恢复 C OOM 不可恢复,不应 catch 恢复,应保留现场(转储/日志)并快速退出由编排层重启,最小动作避免再次分配 ✓ 正确答案 D OOM 只需要在日志中记录即可继续
# 50. 多个 AutoCloseable 资源在业务异常后又关闭失败时,主异常与 suppressed 异常的顺序如何验证 A try 块业务异常是主异常,close 异常通过 getSuppressed() 附加,验证时断言主异常类型与 suppressed 内容 ✓ 正确答案 B close 异常会覆盖业务异常成为主异常 C suppressed 异常无法获取 D 关闭异常总是先于业务异常抛出
# 51. 多态在 Spring 注入(按类型)中的作用与坑点 A 多态支持接口多实现,按类型注入多实现时需用 @Primary/@Qualifier 消歧,或用 List/Map 注入策略集合 ✓ 正确答案 B final 类可以被 CGLIB 代理 C 多实现时按类型注入总是自动选择 D Spring 注入只支持按名称
# 52. 多态的方法调用机制(静态分派与动态分派) A 重载与重写都是动态分派 B 动态分派只发生在编译期 C 重载是静态分派(编译期按静态类型),重写是动态分派(运行期按实际类型,经虚方法表) ✓ 正确答案 D 静态分派由运行期决定
# 53. 如何保留原始 cause、稳定错误码并避免泄露敏感实现信息 A 异常消息应包含完整堆栈 B 用 cause 保留根因、稳定错误码供外部处理,对外消息脱敏只暴露通用提示,完整栈仅存内部日志 ✓ 正确答案 C 错误码不重要,只需消息 D 对外应暴露堆栈以便调试
# 54. 如何在 Spring 统一异常处理(@ControllerAdvice/HandlerExceptionResolver)中保留 cause A @ExceptionHandler 无法访问 cause B 只需记录 getMessage() 即可 C @ExceptionHandler 能拿到原始异常,用日志 API 记录完整异常对象、包装时传入 cause 以保留链 ✓ 正确答案 D cause 会被自动丢弃
# 55. 密封类(sealed class)的 permits 子类控制与模式匹配的穷尽性 A sealed 类允许任意子类 B permits 子类不必直接继承 C sealed 用 permits 封闭子类集,子类须 final/sealed/non-sealed,配合模式匹配穷尽性保证分支完整 ✓ 正确答案 D sealed 与模式匹配无关
# 56. 异常与返回值(Result 对象)的取舍 A 所有错误都应抛异常 B 预期失败用 Result 对象强制处理避免异常开销,真正的异常路径用异常,避免用异常做控制流 ✓ 正确答案 C 异常比 Result 更适合高频业务校验 D Result 对象没有强制处理价值
# 57. 异常信息的国际化与用户友好 A 异常消息直接写死用户文案 B 异常携带稳定错误码与参数,用 MessageSource 按 locale 解析用户文案,技术细节仅存日志 ✓ 正确答案 C 国际化只在服务端日志生效 D 用户应看到完整堆栈
# 58. 异常吞咽(Swallow)与日志记录的常见反模式 A 空 catch、只记消息丢失 cause、只 log 不处理都是反模式,正确做法是记录完整堆栈并决定处理或传播 ✓ 正确答案 B 空 catch 吞异常是安全的 C 记录 e.getMessage() 就足够 D 任何捕获都必须重新抛出
# 59. 异常处理与日志(MDC)的协作 A MDC 自动跨线程继承 B MDC 只在生成日志时使用一次 C MDC 与异常处理无关 D MDC 提供 traceId 等上下文,异常日志自动带上,但需清理并显式传递到异步线程 ✓ 正确答案
# 60. 异常处理中的 finally 块、return 与资源释放 A finally 中 return 是安全的 B finally 只在异常时执行 C 资源释放不保证执行 D finally 中 return 会吞异常、抛异常会覆盖主异常,应优先 try-with-resources 或 finally 内 try/catch 清理 ✓ 正确答案
# 61. 异常指标按类名和错误码聚合时,如何控制标签基数并仍能定位最常见的失败根因 A 指标可直接定位根因无需日志 B 标签基数越高越好 C 订单号应作为指标标签 D 用异常类名+稳定错误码+操作聚合,动态值不进标签,高频失败用指标定位后下钻日志查根因 ✓ 正确答案
# 62. 异常链(Exception Chaining)与 Throwable.getCause() 在多层包装时的调试成本与设计反思 A 包装越多越利于调试 B 多层包装增大栈开销与追溯成本,应只在语义边界包装一次并保留 cause,避免过度嵌套 ✓ 正确答案 C getCause() 无法追溯 D 包装异常不产生任何开销
# 63. 异常链(cause)与 addSuppressed 在 try-with-resources 中的应用 A cause 与 suppressed 是同一概念 B suppressed 异常无法访问 C cause 是纵向根因链,suppressed 是横向被抑制的伴随异常,try-with-resources 用 suppressed 保存关闭异常 ✓ 正确答案 D 关闭异常会覆盖主异常
# 64. 批量处理允许部分成功时,异常模型应如何表达失败项、可重试性与整体提交状态 A 部分成功应直接抛异常 B 失败项无需标记可重试性 C 应用结果对象表达成功项、失败项(含可重试性)与整体状态,避免异常丢失部分成果 ✓ 正确答案 D 整体状态只能由异常决定
# 65. 抽象类与接口在服务实现上的选择准则(Spring 实践) A 抽象类可以多继承 B 接口用于共享实现,抽象类用于契约 C 接口用于契约与多实现,抽象类用于共享实现/模板,Spring 面向接口便于代理与测试 ✓ 正确答案 D 接口不能提供默认实现
# 66. 抽象类与接口的差异、Java 8 默认方法的多继承冲突 A 接口可以有实例字段 B 接口只能单继承 C 抽象类有状态/构造器/模板,接口多实现;默认方法冲突用"类优先+显式 X.super.m()"解决 ✓ 正确答案 D 默认方法冲突自动选择
# 68. 捕获 InterruptedException 后为什么通常需要恢复中断标记,忽略它会破坏哪些取消协议 A 捕获 InterruptedException 后无需恢复标记 B 中断标记无法恢复 C 中断只能由线程池处理 D 阻塞方法抛异常会清除中断标记,恢复标记(interrupt())才能把取消意图传给上层,否则破坏协作取消协议 ✓ 正确答案
# 69. 接口中的 private 方法(Java 9+)与默认方法的协作 A 接口 private 方法可被外部调用 B 接口 private 方法(Java 9+)抽取默认方法间共享逻辑,只能在接口内部使用,不参与覆写 ✓ 正确答案 C 接口 private 方法必须是 abstract D 接口 private 方法可被实现类覆写
# 70. 接口常量、枚举常量与 final 字段的使用边界 A 有界值集合用 enum(类型安全),通用常量用 final 字段,避免在接口中定义常量 ✓ 正确答案 B 接口常量是推荐做法 C enum 常量不能类型安全 D 接口常量不会污染命名空间
# 71. 文本块(Text Block,Java 13+)的缩进与转义规则 A 文本块不处理缩进 B 文本块用三引号包裹,自动去除共同缩进,\s 表示显式空格,适合多行 SQL/JSON ✓ 正确答案 C 文本块不能包含换行 D 文本块是运行期对象非编译期常量
# 72. 构造器链、this() 与 super() 的执行顺序 A this() 与 super() 可以同时出现在第一行 B 子类构造器总是先于父类执行 C 构造器可省略 super() 不调用父类 D this()/super() 必须第一行,父类构造器先于子类执行,this 委托后执行当前构造器剩余部分 ✓ 正确答案
# 73. 注解(Annotation)在 JDK 8 起的类型注解(Type Annotation) A 类型注解只能在字段上 B 类型注解只能作用于类声明 C 类型注解与普通注解无关 D 类型注解(@Target(TYPE_USE))可作用于类型出现的任意位置(泛型参数、转换、new),用于空值检查等 ✓ 正确答案
# 74. 浮点精度与 BigDecimal 在金融计算中 scale 与舍入模式(RoundingMode)的取舍策略有哪些 A 统一 scale 与 RoundingMode,用 String 构造避免误差,compareTo 比较忽略 scale,除法需显式指定 scale ✓ 正确答案 B 用 double 构造 BigDecimal 更精确 C equals 适合比较金额 D 舍入模式选择不影响结果
# 75. 浮点精度与 BigDecimal 的正确使用(构造、scale、等值比较) A new BigDecimal(0.1) 精确 B 用 String 构造避免 double 误差,比较用 compareTo(忽略 scale)而非 equals(要求 scale 相同) ✓ 正确答案 C equals 与 compareTo 等价 D 除法无需指定 scale
# 77. 自定义异常跨模块公开时,如何设计构造器、错误码和序列化边界以保持版本兼容 A 稳定错误码、向后兼容构造器、显式 serialVersionUID 与谨慎字段增删以保持版本兼容 ✓ 正确答案 B 错误码可随版本随意修改 C serialVersionUID 不需要声明 D 构造器可随意删除
# 78. 记录类(record)与普通类的差异,哪些场景不应使用 A record 可变且可继承 B record 不自动生成 equals C record 可被继承 D record 是不可变数据载体,自动生成值语义方法;需要可变、继承、复杂行为时用普通类 ✓ 正确答案
# 79. 访问修饰符(public/protected/package-private/private) A 访问范围 public > protected > package-private > private,protected 允许同包与跨包子类访问 ✓ 正确答案 B protected 与 package-private 完全等价 C private 成员可被同包访问 D package-private 跨包可见
# 80. JDK 21 弃用、Windows 32 位移除与未来删除 API 的应对策略 A 应跟踪弃用警告、制定升级计划、核对依赖与平台(如 Windows 32 位)支持,及时迁移 ✓ 正确答案 B 弃用 API 可放心长期使用 C Windows 32 位永远受支持 D 弃用 API 永远不会被移除
# 81. JDK 25 中 try 语句对结构化并发(Structured Concurrency)抛出的取消异常传播机制如何处理 A 取消异常不传播 B 子任务取消不会影响 scope C StructuredTaskScope 的 join() 汇总子任务异常/取消并传播,try-with-resources 保证 scope 关闭 ✓ 正确答案 D 结构化并发与传统并发无差别
# 82. switch 对 String 的匹配是如何编译实现的(hashCode 比较后 equals 确认),与整数 switch 的 tableswitch/lookupswitch 有何差异 A String switch 用 equals 逐一比较所有 case B String switch 允许 null C 整数 switch 也用 hashCode D String switch 编译为 hashCode 定位 + equals 确认,整数 switch 用 tableswitch/lookupswitch 直接跳转 ✓ 正确答案
# 83. 匿名内部类与 Lambda 在 this 指向、变量捕获与字节码生成上的差异 A Lambda 中 this 指向外层类,匿名内部类 this 指向自身;Lambda 用 invokedynamic 轻量生成,匿名类有独立 class 文件 ✓ 正确答案 B Lambda 有独立 class 文件 C 两者 this 都指向内部类 D 两者字节码完全相同
# 84. JDK-8213077(异常忽略 umbrella bug)的成因与防御性异常处理启示 A 异常忽略掩盖 bug,应记录完整堆栈、保留 cause、明确忽略理由并用静态检查防御 ✓ 正确答案 B 只记录 e.getMessage() 足够 C 异常忽略有利于性能 D 空 catch 是安全的
# 85. Java 24/25 中 JEP 495(第 4 次预览)到 JEP 512(终版)的“更简洁源文件与实例 main”演进边界 A 实例 main 必须 static B JEP 512 在 JDK 24 预览 C JEP 495 第 4 次预览、JEP 512 在 JDK 25 终版,允许未命名类与实例 main 简化样板 ✓ 正确答案 D JEP 512 移除了 main 方法
# 86. Java 中值类(Value Class)提案(Project Valhalla / JEP 401 方向) A 值类有对象身份 B 值类(Project Valhalla/JEP 401)无身份、按值语义扁平化存储,减少内存与 GC 开销 ✓ 正确答案 C 值类可与普通类相同使用 synchronized D 值类只影响语法不影响性能
# 87. JDK 25 引入的 JEP 513 灵活构造函数体(终版,前身为 JDK 23/24 的 JEP 482/492 预览)对异常传播路径的影响是什么 A super() 必须永远是第一行 B 该特性功能是移除 super() C super 前语句可访问 this 字段 D JEP 513 允许 super()/this() 前执行语句(如参数校验),异常可在父类构造前抛出、传播路径更早 ✓ 正确答案
# 88. JEP 511 Module Import Declarations 在 JDK 25 对源文件头部 import 模块的影响 A 模块导入只影响运行时 B import module 批量导入模块导出的所有包以简化头部 import,命名冲突时需显式 import,是编译期特性 ✓ 正确答案 C 模块导入会改变模块图 D 模块导入替代所有 import
# 89. JEP 513 Flexible Constructor Bodies 在 JDK 25 允许构造函数中语句先于 this()/super() 的边界 A super 前可执行不依赖 this/父类状态的语句,但不能访问 this/父类成员,且必须保证 super 恰好调用一次 ✓ 正确答案 B super 前可访问 this 字段 C super 前可任意调用实例方法 D super 可放在 finally 中
# 90. Java 9 引入的字符串紧凑字符串(Compact Strings) A Compact Strings 用 char[] 存储 B Compact Strings 用 byte[] + coder,LATIN-1 字符 1 字节/字符省内存,非 ASCII 用 UTF-16,API 语义不变 ✓ 正确答案 C Compact Strings 改变了字符串 API 语义 D Compact Strings 只影响中文
# 91. Java 中 strictfp 的历史与现状 A strictfp 强制 IEEE 754 严格浮点,JDK 17 起默认即严格(JEP 306),strictfp 成为无操作保留 ✓ 正确答案 B strictfp 会降低精度 C strictfp 只在 JDK 17 后可用 D strictfp 用于整数运算
# 92. Java 模式匹配的 instanceof、模式变量与 switch 表达式在 JDK 25 中的作用域规则有何更新 A 模式变量在任意分支都可用 B 模式变量可在未匹配路径使用 C 模式变量作用域由流经分析决定,instanceof 匹配成功与否决定可用,switch 中在 case 内可用,JDK 25 细化规则 ✓ 正确答案 D 模式变量作用域无规则
# 93. Object 通用方法(equals/hashCode/toString/clone/finalize/getClass/wait/notify)的正确重写 A equals 需满足契约且与 hashCode 一致,toString 提供可读表示,finalize 已废弃,wait/notify 是监视器原语 ✓ 正确答案 B equals 与 hashCode 无需一致 C getClass 可重写 D finalize 是推荐清理方式
# 94. final、finally、finalize 三者的本质差异 A 三者本质相同 B final 是修饰符、finally 是异常处理块、finalize 是已废弃的生命周期方法,三者本质无关 ✓ 正确答案 C finalize 比 try-with-resources 更可靠 D finally 可以修饰类
# 95. switch 的 fall-through 历史陷阱与箭头语法(->)的 break 语义差异 A 传统 switch 若无 break 不会 fall-through B 箭头语法也需 break C 箭头语法总需要 default D 传统 switch 缺 break 会 fall-through 连锁执行,箭头语法(->)自动终止无需 break ✓ 正确答案
# 96. try-with-resources 在 JDK 25 中对 Scoped Values 与清理钩子的支持边界 A Scoped Values 是可变全局变量 B Scoped Values 跨线程自由设置 C Scoped Values 与 ThreadLocal 完全相同 D Scoped Values 用 try-with-resources 定义不可变值的作用域,结束自动清理,是 ThreadLocal 的安全替代 ✓ 正确答案
# 97. var 局部类型推断在 JDK 25/26 中对涉及记录类与密封类的复杂泛型推断边界如何演化 A var 是动态类型 B var 从初始化器静态类型推断,record/密封类场景下推断更精确,但不改变静态类型语义 ✓ 正确答案 C var 会因密封类收窄为具体子类 D var 无法用于 record
# 98. 异常性能基准测试的常见误区 A 异常总是极慢 B 异常创建没有成本 C try/catch 本身一定昂贵 D 误区包括未预热 JIT、未区分异常创建与传播、忽略栈深与 GC,应用 JMH 预热并控制变量 ✓ 正确答案
# 99. record 的紧凑构造器(Compact Constructor)与规范构造器在参数校验与防御性拷贝上的分工 A 紧凑构造器不执行参数校验 B 紧凑构造器必须显式赋值 C 紧凑构造器是规范构造器简写,在体内做参数校验与防御性拷贝后隐式赋值,反序列化不走构造器 ✓ 正确答案 D 紧凑构造器与规范构造器无关