# 1. Kotlin 与 Java 的互操作边界,空安全、扩展函数、协程与 Java 代码的桥接注意点如何? A Kotlin 与 Java 完全无缝,无任何边界 B suspend 函数在 Java 中可直接调用 C 扩展函数可直接在 Java 中调用 D Java 类型在 Kotlin 中是平台类型、扩展函数编译为静态方法、suspend 需桥接,需注意边界 ✓ 正确答案
# 2. Kotlin 挂起函数(suspend)的编译产物,Continuation 与状态机如何实现非阻塞,与虚拟线程的定位差异如何? A 两者机制完全相同 B suspend 通过状态机 + Continuation 实现非阻塞,虚拟线程通过阻塞时让渡载体线程,机制不同 ✓ 正确答案 C suspend 是阻塞式模型 D 虚拟线程是语言层概念
# 3. Kotlin 协程的调度器(Dispatchers.IO/Default/Unconfined)与线程池的关系,协程取消与结构化并发的机制? A Unconfined 使用固定线程池 B 协程取消是非协作式的,无需检查 C 协程取消不会传播到子协程 D Dispatchers.IO 与 Default 共享底层线程池,Default 适合 CPU 密集 ✓ 正确答案
# 4. 内联值类(value class)与 @JvmInline 的装箱边界及性能取舍 A 值类在泛型、数组等场景也总是内联免装箱 B @JvmInline 与值类无关 C 值类大多数场景内联免分配,但作为泛型参数、数组、可空时退化为装箱 ✓ 正确答案 D 值类总是会分配对象
# 5. Kotlin 协程在 Spring WebFlux 项目中的使用与性能对比? A WebFlux 不支持 suspend 协程 B 协程是阻塞式的,性能远低于响应式 C Spring 支持 suspend 控制器,协程与响应式底层都非阻塞,性能相当但协程更易读 ✓ 正确答案 D 协程无法获得高并发
# 6. Groovy/Scala/Kotlin 在 JVM 服务端生态中的定位,何时值得引入多语言? A Scala 适合脚本与 DSL 场景 B Kotlin 是服务端 Java 的主要替代,Groovy 适合脚本/DSL,Scala 适合大数据/函数式 ✓ 正确答案 C Groovy 性能强于 Kotlin D 引入多语言无需考虑团队成本
# 7. Kotlin 与 Java 互操作的注意点,空安全注解、平台类型、默认参数与 `@JvmOverloads`、伴生对象静态化如何? A 需用 @JvmOverloads 生成重载供 Java 调用,@JvmStatic/@JvmField 静态化伴生对象成员 ✓ 正确答案 B 默认参数在 Java 侧可直接使用 C 伴生对象成员默认就是静态的 D 空安全注解对互操作无影响
# 8. Flow 的背压与冷/热流语义,与 RxJava/Reactor 在 JVM 侧的选型差异? A Flow 是热流,不支持背压 B Flow 是 Kotlin 原生、支持背压与冷/热流,选型看语言集成与生态匹配 ✓ 正确答案 C Flow 无法与协程集成 D Reactor 是 Kotlin 原生库
# 9. 扩展函数、密封类与 `when` 穷尽性如何改善领域建模,与 Java 的等价写法对比? A 密封类与 when 无法穷尽性检查 B 扩展函数会破坏封装 C 扩展函数保持类纯净,密封类 + when 提供编译期穷尽性检查,优于 Java 的 instanceof 链 ✓ 正确答案 D when 必须手写 default 分支
# 10. Kotlin 协程与 Java 虚拟线程的互操作,suspend 函数如何桥接 Java? A suspend 函数在 Java 中可直接调用 B 互操作只能使用 runBlocking C 协程无法在虚拟线程上运行 D suspend 编译为 Continuation 方法,Java 侧需用 CompletableFuture/回调等桥接 ✓ 正确答案
# 11. kotlinx.serialization 与 Jackson 的对比(Kotlin 反射、无参构造问题) A Jackson 完全支持 Kotlin 特性,无需额外适配 B kotlinx.serialization 通过编译器生成序列化码,免反射;Jackson 需 Kotlin 反射与无参构造适配 ✓ 正确答案 C kotlinx.serialization 依赖 kotlin-reflect D 两者在 Kotlin 支持上完全等价
# 12. data class 的 copy/equals 与组件函数(componentN)的解构 A equals 包含类体内所有属性 B data class 自动生成 equals/hashCode/copy/componentN,且基于主构造属性 ✓ 正确答案 C copy 会修改原对象 D componentN 解构顺序与属性声明无关
# 13. Kotlin Multiplatform 在后端与客户端共享代码的适用边界? A KMP 可共享所有代码,包括 UI 与平台 API B KMP 无法共享 data class C KMP 适合共享纯 Kotlin 业务逻辑,平台差异需 expect/actual 分别实现,构建复杂 ✓ 正确答案 D KMP 只支持 JVM 平台
# 14. Kotlin 集合只读接口(List/readOnly)与 Java 可变集合互操作时的防御性拷贝边界? A 只读接口底层可能可变,与 Java 互操作时需防御性拷贝隔离可变性 ✓ 正确答案 B Kotlin 只读接口就是不可变集合 C Kotlin 集合无法与 Java 互操作 D 只读接口禁止底层可变
# 15. Kotlin 空安全与 Java 平台类型的边界,@Nullable 注解的互认机制如何? A 未标注的 Java 类型是平台类型,需小心;@Nullable 注解互认可恢复编译期检查 ✓ 正确答案 B Java 类型在 Kotlin 中总是不可空 C 平台类型有编译期空检查 D 空注解不影响 Kotlin 识别
# 16. Kotlin 的协程调度器与线程池映射,Dispatchers.IO 如何实现? A Dispatchers.IO 与 Default 完全独立,无共享 B IO 调度器无并发限制 C IO 任务会阻塞 CPU 调度线程 D Dispatchers.IO 基于共享线程池并限制并发,用于阻塞 IO,与 Default 共享底层线程 ✓ 正确答案
# 17. Kotlin 与 Java 混编的构建,Gradle 的 kotlin-jvm 插件的源集管理如何? A kotlin-jvm 插件自动处理 src/main/kotlin 与 java 源集并支持交叉编译 ✓ 正确答案 B kotlin-jvm 插件只编译 Kotlin 源集,忽略 Java C 混编时 Kotlin 不能引用 Java 代码 D 混编无需配置 jvmTarget
# 18. Kotlin 协程取消与 Java 阻塞调用的互操作,runInterruptible 的作用如何? A runInterruptible 让 blocking 调用无法被取消 B runInterruptible 与取消机制无关 C runInterruptible 在协程取消时中断底层线程,使 Java 阻塞调用可被取消 ✓ 正确答案 D 所有 Java 阻塞调用都能被 runInterruptible 中断
# 19. Kotlin 的 @JvmStatic/@JvmField 与伴生对象的 Java 互操作细节 A 伴生对象成员默认就是静态的 B Java 无法访问伴生对象成员 C @JvmField 生成 getter/setter D @JvmStatic 生成静态方法、@JvmField 生成静态字段,未标注时 Java 需用 Companion 访问 ✓ 正确答案