# 1. BIO 的 one-connection-per-thread 模型在 C10K 问题下的资源瓶颈与伪异步 I/O 局限 A BIO 每连接一线程适合高并发 B BIO 每连接一线程使 C10K 下线程数爆炸浪费资源,伪异步用线程池复用但仍是阻塞、线程池有限受限 ✓ 正确答案 C 伪异步无局限 D BIO 线程可复用
# 2. BIO、NIO、AIO 三种 I/O 模型的本质差异与适用场景辨析 A NIO 阻塞 B BIO 阻塞、NIO 非阻塞+多路复用、AIO 异步回调,各自适用简单/高并发/异步 I/O 场景 ✓ 正确答案 C AIO 阻塞 D BIO 高并发
# 3. Date/Calendar 的设计缺陷与线程安全问题 A Date 不可变 B SimpleDateFormat 线程安全 C Calendar 月份 1 开始 D Date/Calendar 可变、月份 0 索引、SimpleDateFormat 线程不安全,用 java.time 不可变 API 替代 ✓ 正确答案
# 4. DateTimeFormatter 的线程安全与缓存策略 A DateTimeFormatter 线程不安全 B 需每次创建 C DateTimeFormatter 不可变线程安全,可用 static final 缓存复用避免重复创建 ✓ 正确答案 D 与 SimpleDateFormat 相同
# 5. FileChannel.transferTo 零拷贝的底层 sendfile/splice 实现与适用边界 A transferTo 只适合小文件 B transferTo 需要用户态拷贝 C 零拷贝无限制 D transferTo 用 sendfile/splice 内核态零拷贝,适合文件→socket 大文件传输,但平台相关、只读传 ✓ 正确答案
# 6. Files/Path(NIO.2)相对传统 File 类的改进与工程价值 A Path 与 File 功能相同 B File 功能更全 C Files 不能读文件 D Path/Files 提供简洁静态方法、流式惰性读写、目录遍历、监听,功能全面,替代传统 File 类 ✓ 正确答案
# 7. Instant 在跨时区持久化的最佳实践 A 存储 LocalDateTime 最安全 B Instant 是 UTC 时间戳独立于时区,跨时区用 Instant/UTC 存储、展示转本地时区,避免 LocalDateTime 歧义 ✓ 正确答案 C 存储本地时间 D Instant 依赖时区
# 8. NIO.2 的 Files.walk/Files.list 流式遍历在大目录下的资源泄漏风险与 Spliterator 控制 A Files.walk/list 返回绑定目录的流,需 try-with-resources 关闭避免句柄泄漏,大目录流式处理 ✓ 正确答案 B 句柄不会泄漏 C 流自动关闭 D walk 流无需关闭
# 9. NumberFormat/DateFormat 的本地化与线程安全 A 按 Locale 本地化但非线程安全(可变状态),需 ThreadLocal/每次创建,或用线程安全替代 ✓ 正确答案 B 两者线程安全 C 本地化与 Locale 无关 D 可共享线程安全
# 10. Pattern 的预编译与 flags 优化 A Pattern 每次匹配都编译 B flags 无性能影响 C Pattern 应预编译缓存复用(static final),flags 控制匹配语义,避免重复编译是性能优化 ✓ 正确答案 D 编译无成本
# 11. Pattern/Matcher 的线程安全与回溯陷阱 A Matcher 线程安全 B 回溯无风险 C Pattern 非线程安全 D Pattern 线程安全可共享,Matcher 非线程安全需每次创建;正则回溯(嵌套量词)可能 ReDoS 需避免 ✓ 正确答案
# 12. Pipe(SourceChannel/SinkChannel)的线程间通信语义与典型坑点 A Pipe 双向通信 B Pipe 是单向线程间通道(Sink 写、Source 读),有容量/阻塞/单向坑点,需正确关闭 ✓ 正确答案 C Pipe 可多线程并发写 D Pipe 无容量限制
# 13. String.intern 返回的引用在 JDK 6 与 JDK 7+ 中分别存储在永久代还是堆中,这一变化对内存与回收有何影响 A 两者都在堆 B JDK 7+ intern 在永久代 C JDK 6 intern 在永久代(易 OOM),JDK 7+ 在堆(可回收),intern 仍应谨慎 ✓ 正确答案 D intern 无内存影响
# 14. String、StringBuilder、StringBuffer 的差异与适用场景 A String 可变 B StringBuffer 性能最好 C StringBuilder 线程安全 D String 不可变、StringBuilder 可变高效非线程安全、StringBuffer 可变线程安全(性能差),单线程拼接用 StringBuilder ✓ 正确答案
# 15. serialPersistentFields 如何显式声明参与序列化的字段集合,与 transient 及字段重命名场景的兼容策略如何配合 A 它声明所有字段序列化 B 它忽略 transient C 无兼容作用 D serialPersistentFields 显式声明序列化字段集合,transient 跳过字段,配合 readObject/writeObject 实现重命名兼容 ✓ 正确答案
# 16. AIO(AsynchronousFileChannel)的 CompletionHandler 回调模型与 Future 模式的取舍 A Future 模式异步回调 B CompletionHandler 适合事件驱动异步(逻辑复杂),Future 模式 get() 阻塞(简单),可包装 CompletableFuture ✓ 正确答案 C Future 无阻塞 D 回调阻塞主线程
# 17. ByteBuffer 字节序(ByteOrder.BIG_ENDIAN/LITTLE_ENDIAN)在网络协议与文件格式解析中的影响 A 字节序只影响读不影响写 B 字节序不影响解析 C 默认小端 D 网络协议用大端(BIG_ENDIAN)、文件格式可能小端,ByteBuffer 需按格式设置 order 否则多字节值解析错误 ✓ 正确答案
# 18. ByteBuffer 的 position/limit/capacity 三指针与 flip/rewind/clear/compact 的状态机语义 A flip 清空重写 B clear 保留未读 C flip 写转读(limit=position, position=0)、rewind 重复读、clear 清空重写、compact 保留未读继续写 ✓ 正确答案 D compact 清空
# 19. Channel 与 Selector 多路复用机制在 Linux epoll 与 macOS kqueue 上的实现差异 A epoll 与 kqueue 都是事件驱动高效复用,Selector 底层 Linux 用 epoll、macOS 用 kqueue,Java 封装统一 ✓ 正确答案 B epoll 有 fd 数限制 C macOS 用 epoll D Linux 用 select
# 20. DirectByteBuffer 的分配、回收(Cleaner/PhantomReference)与 -XX:MaxDirectMemorySize 约束 A DirectByteBuffer 用堆内存 B 直接内存立即回收 C DirectByteBuffer 直接内存用 Cleaner(PhantomReference)在 GC 时回收,-XX:MaxDirectMemorySize 限制总量 ✓ 正确答案 D 直接内存无限制
# 21. FileChannel.lock 文件锁的进程级语义与 JVM 内多线程共享同一 Channel 的边界 A 锁是 JVM 内锁 B JVM 内多线程互斥 C FileChannel.lock 是进程级锁(跨进程互斥),JVM 内多线程共享同一 Channel 不互斥 ✓ 正确答案 D 锁与 Channel 无关
# 22. MappedByteBuffer 内存映射文件的页缓存机制与大文件随机读写性能 A 映射不需页缓存 B 随机读写慢 C MappedByteBuffer 用 mmap 页缓存映射文件,随机读写像内存(避免系统调用),需 force() 落盘 ✓ 正确答案 D 映射无大小限制
# 23. Selector 空轮询 bug 的成因(epoll bug)与 Netty 的重建 Selector 解决方案 A 空轮询是正常行为 B epoll 空轮询 bug 使 select() 无事件也返回 0 导致 CPU 空转,Netty 检测后重建 Selector(重注册 Channel) ✓ 正确答案 C Netty 无法解决 D 空轮询不耗 CPU
# 24. Charset 与 StandardCharsets 的常用编码 A 应手动写编码名而非用常量 B StandardCharsets 无 UTF_8 常量 C 编码名永不会写错 D StandardCharsets 提供 UTF_8/UTF_16/ISO_8859_1 等常量,UTF-8 是现代标准,用常量避免编码名错误 ✓ 正确答案
# 25. ChronoUnit 与 TemporalAdjusters 在工作日计算与节假日调整中的工具方法 A TemporalAdjusters 算差值 B ChronoUnit 提供时间单位与差值计算,TemporalAdjusters 调整日期(月底/周一/下个工作日),自定义调整器处理节假日 ✓ 正确答案 C ChronoUnit 调整日期 D 两者无关
# 26. Clock 抽象(Clock.fixed/Clock.offset)的测试价值 A Clock 无法注入 B Clock 只能系统时间 C Clock.fixed 固定时间、Clock.offset 偏移时间,测试中注入 Clock 控制时间使测试确定可复现 ✓ 正确答案 D 测试不能用 Clock
# 27. Collator 在区域敏感字符串比较的应用 A Collator 用默认 Unicode 比较 B Collator 按 Locale 区域规则比较字符串(中文拼音/德语变音),用于区域敏感排序,非线程安全 ✓ 正确答案 C 区域无关 D 线程安全
# 28. Duration 与 Period 的差异(时间量 vs 日期量) A Duration 是日期量 B Period 是时间量 C Duration 是精确时间量(秒纳秒)、Period 是日历日期量(年月日),按需要精确时长还是日历日期选择 ✓ 正确答案 D 两者相同
# 29. ISO 8601 与 RFC 3339 的字符串互换 A 时间字符串需手动拼接 B RFC 3339 是 ISO 8601 的 Internet 子集 C 两者无关 D ISO 8601/RFC 3339 是时间字符串标准(UTC 带 Z 或偏移),java.time 用 Instant/OffsetDateTime 格式与解析 ✓ 正确答案
# 30. JDK 8 DateTimeFormatterBuilder 的复杂模式构造 A 只能 appendPattern B 与 pattern 相同 C 无法自定义 D DateTimeFormatterBuilder 拼接复杂格式(appendPattern/appendValue/appendOptional),用于简单 pattern 无法表达的复杂格式 ✓ 正确答案
# 31. JDK 9 Locale.IsoCountryCode 与 Locale.forLanguageTag A forLanguageTag 只能两字母 B new Locale 解析标签 C IsoCountryCode 指定国家代码标准,forLanguageTag 解析 BCP 47 语言标签构建 Locale,比 new Locale 更规范 ✓ 正确答案 D forLanguageTag 不支持扩展
# 32. UTF-8 乱码的常见根因(BOM、多字节截断、双重编码)与沿 HTTP/数据库/文件链路定位的方法 A 乱码只有一种根因 B 乱码无法定位 C 编码总一致 D 乱码根因含 BOM、多字节截断、双重编码、编码不一致,统一各环节 UTF-8 并检查 charset ✓ 正确答案
# 33. Java 25 中字符串相关的优化与变更 A 字符串模板用内嵌表达式简化拼接,但截至 JDK 25 仍未定稿(JEP 459 仅为 JDK 22 预览),拼接与 format 仍是主流 ✓ 正确答案 B Java 25 无字符串变更 C 字符串模板已移除 D 字符串模板只用于数字
# 34. Java 9 Matcher.replaceAll 的流式方法 A replaceAll 只能固定字符串 B 无流式方法 C Java 9 的 replaceAll(Function) 用函数动态替换每个匹配,results() 返回匹配流,支持流式处理 ✓ 正确答案 D results() 返回字符串
# 35. Java 原生序列化的版本兼容规则中,哪些字段变更向后兼容、哪些会直接抛出 InvalidClassException A serialVersionUID 一致且字段类型不变时增删字段向后兼容(默认值/忽略),serialVersionUID 不匹配或类型不兼容抛 InvalidClassException ✓ 正确答案 B 字段类型变化兼容 C serialVersionUID 不匹配仍兼容 D 任何变更都兼容
# 36. Locale 的层级与默认 locale 获取 A Locale 只有语言维度 B 默认 locale 固定 C getDefault 无类别 D Locale 层级含语言/脚本/国家/变体/扩展,getDefault() 获取 JVM 默认 locale,按 Category 区分格式/显示 ✓ 正确答案
# 37. Locale.forLanguageTag 与 Locale.Builder 在复杂语言标签解析上的差异 A Builder 解析字符串 B 两者都解析字符串 C forLanguageTag 解析 BCP 47 标签字符串(宽松),Locale.Builder 组件式构建(严格校验),按输入形态选择 ✓ 正确答案 D forLanguageTag 严格校验
# 38. MonthDay/Year/YearMonth 的工程场景 A MonthDay 表示月日(生日/节日)、Year 表示年份、YearMonth 表示年月(月度统计),用于部分日期建模 ✓ 正确答案 B MonthDay 含年 C YearMonth 无年 D 三者相同
# 39. ObjectInputFilter 的 maxdepth/maxrefs/maxbytes 限制与黑白名单模式如何在 JEP 290/415 框架下构成纵深防御 A maxdepth/maxrefs/maxbytes 限制资源、黑白名单限制类,JEP 290/415 框架下构成反序列化纵深防御 ✓ 正确答案 B 无类限制 C 只限制字节数 D 过滤器可选
# 40. Pattern.UNICODE_CHARACTER_CLASS 与 Unicode 属性 A \d 默认匹配 Unicode 数字 B Unicode 属性仅 ASCII C UNICODE_CHARACTER_CLASS 使预定义类按 Unicode 语义匹配,\p{...} 匹配 Unicode 属性,用于多语言文本 ✓ 正确答案 D 无 Unicode 支持
# 41. Pattern.asPredicate 与流式协作 A asPredicate 返回 Matcher B asPredicate 是全匹配 C asPredicate 不能用于流 D Pattern.asPredicate() 把正则转 Predicate(test 用 find()),用于 Stream.filter 流式过滤 ✓ 正确答案
# 42. Scanner 的局限与生产禁用 A Scanner 性能好 B Scanner 捕获异常 C Scanner 适合大数据 D Scanner 用正则解析慢、性能差、吞异常,生产应避免,用 BufferedReader/Stream 或专用解析器 ✓ 正确答案
# 43. String.format 与 MessageFormat 的本地化取舍 A String.format 用 %s 格式(本地化差),MessageFormat 用 {0} 占位支持 Locale/复数/顺序调整,适合国际化 ✓ 正确答案 B String.format 支持本地化 C MessageFormat 本地化差 D MessageFormat 无占位符
# 44. String.isBlank 与 String.strip 的 Unicode 空白处理 A trim 处理 Unicode 空白 B strip 只处理 ASCII C isBlank 只 ASCII D isBlank/strip 基于 Character.isWhitespace(Unicode 空白),trim 只处理 ASCII 空白,Unicode 场景用 isBlank/strip ✓ 正确答案
# 45. String.join 与 Collectors.joining 的取舍 A String.join 直接拼接集合(简单),Collectors.joining 用于 Stream 管道(支持 prefix/suffix),按上下文选择 ✓ 正确答案 B joining 无 prefix/suffix C String.join 支持 prefix D 两者都只能 Stream
# 46. String.lines 与 Files.readAllLines 的取舍 A readAllLines 惰性 B String.lines 惰性拆分字符串行,Files.readAllLines 一次性读文件行(小文件),大文件用 Files.lines() 流式 ✓ 正确答案 C 两者都流式 D lines() 一次性
# 47. String.repeat(int) 的实现复杂度 A String.repeat 用倍增复制(总复制 O(n)),避免逐次拼接的 O(n²),高效 ✓ 正确答案 B repeat 复杂度 O(n²) C repeat 逐次拼接 O(n²) D repeat 无优化
# 48. String.split 的限制(尾部空字符串)与 Splitter(Guava) A String.split 默认丢弃尾部空、参数是正则(需转义),Splitter 保留尾部空、可配置(trim/omitEmpty/limit)更健壮 ✓ 正确答案 B split 无需转义 C Splitter 丢弃尾部空 D split 保留尾部空
# 49. StringJoiner 与 String.join 的底层实现差异是什么,Stream 的 Collectors.joining 又复用了哪个组件 A String.join 内部用 StringJoiner,Collectors.joining 复用 StringJoiner 作累加容器,都基于可变拼接 ✓ 正确答案 B String.join 用 StringBuilder C joining 用 StringBuilder D StringJoiner 独立实现
# 50. StringTokenizer 的遗留问题 A 支持正则 B 是新标准 C StringTokenizer 是遗留分割类,API 不友好、无正则、行为不一致,新代码用 String.split 或 Splitter 替代 ✓ 正确答案 D 与 split 一致
# 51. TemporalAdjusters 的常见用法(月初、月底、周一) A 只有月初方法 B TemporalAdjusters 提供 firstDayOfMonth/lastDayOfMonth/next(MONDAY) 等,date.with(...) 调整到月初/月底/周一 ✓ 正确答案 C 无法调整到周一 D 需手动计算
# 52. TimeUnit 与 Duration 的转换 A TimeUnit 是时间量 B Duration 是枚举 C 两者相同 D TimeUnit 是时间单位枚举(单位换算),Duration 是时间量对象(时长/时间差),用 toXxx/ofXxx 转换 ✓ 正确答案
# 53. Unicode 规范化(NFC/NFD)对字符串比较的影响 A NFC/NFD 使等价字符串字节不同,Normalizer 规范化后比较避免误判不等 ✓ 正确答案 B NFC 与 NFD 无差异 C 规范化后仍不等 D 无需规范化
# 54. java.time 与数据库时间类型的映射(JDBC 4.2) A JDBC 4.2 映射 LocalDate-DATE、LocalDateTime-TIMESTAMP、OffsetDateTime-TIMESTAMP WITH TIME ZONE,setObject/getObject 使用 ✓ 正确答案 B JDBC 只支持 java.util.Date C 无映射 D 需手动转换
# 55. java.time(JSR-310)的核心类(LocalDateTime/ZonedDateTime/Instant) A LocalDateTime 带时区 B Instant 带时区 C LocalDateTime 无时区本地时间、ZonedDateTime 带时区时间、Instant UTC 时间点,按语义选择 ✓ 正确答案 D ZonedDateTime 无时区
# 56. record 的序列化为何按组件名直接赋值而不走规范构造器,紧凑构造器里的参数校验在反序列化时是否仍会执行 A 反序列化走构造器 B 构造器校验每次执行 C 反序列化与构造器相同 D record 反序列化按组件名直接赋值、不走构造器,紧凑构造器校验不执行,校验需另行处理 ✓ 正确答案
# 57. 为何 RPC 与缓存场景普遍弃用 Java 原生序列化而选 Protobuf/Kryo,从体积、速度、跨语言、安全四个维度如何比较 A Java 原生序列化体积大、慢、仅 Java、不安全,Protobuf/Kryo 体积小、快、跨语言/安全,故 RPC/缓存弃用原生 ✓ 正确答案 B Java 序列化体积小 C Java 序列化跨语言 D Protobuf 不安全
# 58. 反序列化 gadget 链由哪些环节构成(可序列化入口类、回调方法、危险 sink),如何从依赖裁剪角度削减可利用类 A gadget 链由入口类→回调→危险 sink 构成,依赖裁剪移除危险类、白名单过滤削减可利用类降低攻击面 ✓ 正确答案 B gadget 链只有入口类 C 无法削减 D 依赖无关
# 59. 同步/异步、阻塞/非阻塞四象限的语义区分与常见误解 A 异步一定非阻塞 B 同步与阻塞相同 C 只有两种组合 D 同步/异步是结果获取方式,阻塞/非阻塞是线程是否等待,四象限组合(BIO 同步阻塞、NIO 同步非阻塞、AIO 异步) ✓ 正确答案
# 60. 夏令时跳变对时间计算的影响(LocalDateTime 加 24 小时?) A LocalDateTime 加 24 小时感知夏令时 B 夏令时无影响 C ZonedDateTime 不感知 DST D LocalDateTime 加 24 小时不感知夏令时,跨时区/夏令时用 ZonedDateTime.plusDays 正确处理 DST 跳变 ✓ 正确答案
# 61. 大量调用 String.intern 为何可能拖慢查找甚至引发 OOM,StringTable 大小(-XX:StringTableSize)如何调优 A StringTable 无限 B intern 永久不占内存 C 大量 intern 使 StringTable 桶冲突、查找变慢、字符串常驻内存可能 OOM,用 -XX:StringTableSize 增大桶数 ✓ 正确答案 D intern 无影响
# 62. serialVersionUID 的作用、默认生成算法与显式声明的工程规范 A 默认按类结构自动计算(易变),工程规范是显式声明固定值避免类结构变化破坏反序列化 ✓ 正确答案 B 默认固定不变,类结构变化不影响反序列化 C 运行序列化无需声明 serialVersionUID D serialVersionUID 与反序列化兼容性无关
# 63. SimpleDateFormat 线程不安全的原因与替代方案(ThreadLocal 缓存/DateTimeFormatter) A SimpleDateFormat 内部可变状态致线程不安全,用 ThreadLocal 隔离或 DateTimeFormatter(不可变线程安全)替代 ✓ 正确答案 B 可共享 C SimpleDateFormat 线程安全 D 无替代
# 64. 序列化代理模式(Serialization Proxy)如何借助 writeReplace/readResolve 规避默认序列化在对象不变量与安全性上的风险 A 代理无用 B 序列化代理用 writeReplace 序列化代理、readResolve 恢复,通过代理重建对象可校验不变量、不暴露内部、更安全 ✓ 正确答案 C 代理只序列化内部 D 代理绕过不变量
# 65. String.formatted(JDK 15+)与文本块组合在模板渲染中的应用 A formatted 是拼接 B formatted 无占位 C 文本块不能 format D String.formatted 用 %s 占位格式化字符串,配合文本块做多行模板渲染(SQL/HTML/邮件模板) ✓ 正确答案
# 66. 字符串常量池(String Constant Pool)的运行机制与 intern A 每个字面量独立对象 B new String 也入池 C 编译期字面量入常量池(StringTable 在堆),相同字面量复用引用,intern 显式入池返回池中引用 ✓ 正确答案 D 常量池无复用
# 67. 时区(Zone)与 UTC 偏移(Offset)的概念差异 A Offset 含夏令时 B Offset 是固定 UTC 偏移(无 DST),Zone 是时区(含 DST 规则,偏移随季节变化) ✓ 正确答案 C Zone 固定 D 两者相同
# 68. 枚举的序列化为何只写出常量名字而不写字段,反序列化如何保证单例语义且不触发私有构造器 A 枚举序列化时会完整写出所有字段值 B 反序列化枚举会调用其私有构造器创建新实例 C 枚举序列化只写常量名,反序列化用 Enum.valueOf 返回已有单例,不触发构造器、不写字段、保持单例 ✓ 正确答案 D 枚举反序列化后可能得到与原常量不同的实例
# 69. 正则回溯导致的 ReDoS 攻击与防御 A 正则回溯(嵌套量词)可能指数级匹配致 ReDoS,避免嵌套量词、用原子组、限制输入长度、超时防御 ✓ 正确答案 B 回溯无风险 C 嵌套量词安全 D 无法防御
# 70. 正则表达式元字符、贪婪与非贪婪匹配 A 元字符构成正则语法,贪婪量词尽量多匹配、非贪婪(*?)尽量少匹配,按需选择避免匹配范围错误 ✓ 正确答案 B 贪婪量词尽量少 C 非贪婪尽量多 D 贪婪/非贪婪无差异
# 71. JDK 25 中 DateTimeFormatter 对 Unicode 区域数据(CLDR)的最新版本支持 A DateTimeFormatter 不依赖区域数据 B DateTimeFormatter 依赖 CLDR 区域数据,JDK 25 更新 CLDR 版本,改善本地化日期格式与区域数据 ✓ 正确答案 C CLDR 无关 D 格式固定
# 72. String 的紧凑字符串(Compact Strings)压缩率 A Compact Strings 用 byte[]+coder,LATIN-1 字符 1 字节/字符,ASCII 字符串内存节省约 50%,非 LATIN-1 仍 2 字节 ✓ 正确答案 B 中文也压缩 50% C 无压缩 D 所有字符串压缩 50%
# 73. 序列化流的魔数与类描述符结构如何组织,重复写出同一对象引用时句柄(handle)机制怎样避免对象图被复制多份 A 重复对象重复序列化 B 序列化流无魔数 C 序列化流以魔数+版本开头,含类描述符;handle 机制让同一对象引用只写一次句柄,避免对象图复制多份、支持循环引用 ✓ 正确答案 D 循环引用无法序列化
# 74. Matcher.matches/find/lookingAt 的语义差异与使用场景 A find 全匹配 B lookingAt 全匹配 C matches 部分匹配 D matches 全匹配(验证)、find 查找子串(搜索/提取)、lookingAt 开头前缀,按匹配需求选择 ✓ 正确答案