笔记kotlin注意的点

Kotlin 协程是一种轻量级的并发模型,用同步代码的写法实现异步逻辑,本质是基于挂起(suspend)和状态机,在不阻塞线程的情况下进行任务切换。

Kotlin 协程是一种基于挂起函数的轻量级并发方案,通过编译期状态机实现,在不阻塞线程的前提下进行任务调度,结合 Android 生命周期可以安全、高效地处理异步任务。

Q1:协程会不会阻塞线程?

不会,suspend 只是挂起协程,不会阻塞线程。


Q2:协程怎么取消?

通过 Job,并且协程是协作式取消,需要在挂起点检查。


Q3:协程和 RxJava 怎么选?

协程更适合顺序逻辑和生命周期管理,Rx 更适合复杂流式变换。

五、协程 vs 线程(必问)

对比项 线程 协程
创建成本 极低
切换成本 内核态 用户态
是否阻塞线程 不会
数量级 几百 几十万
生命周期管理

一句话总结:

线程是资源,协程是任务


fun main() = runBlocking {

println("main start thread=${Thread.currentThread().name}")

launch {

println("C1 start thread=${Thread.currentThread().name}")

delay(1000)

println("C1 after delay thread=${Thread.currentThread().name}")

}

launch {

println("C2 start thread=${Thread.currentThread().name}")

heavyWork() // 模拟耗时

println("C2 after heavyWork thread=${Thread.currentThread().name}")

}

println("main end")

}

suspend fun heavyWork() {

println("heavyWork start thread=${Thread.currentThread().name}")

Thread.sleep(2000)

println("heavyWork end thread=${Thread.currentThread().name}")

}

二、你先猜一下 Log 顺序(很重要)

先别往下看,你自己想一想:

delay(1000) 会不会挡住别的协程?

Thread.sleep(2000) 会不会?

三、真实打印顺序(标准答案)

text

复制代码

main start thread=main

main end

C1 start thread=main

C2 start thread=main

heavyWork start thread=main

heavyWork end thread=main

C2 after heavyWork thread=main

C1 after delay thread=main

这里Thread.sleep(2000)不会让出线程

✔ suspend ≠ 不执行

✔ delay ≠ 偷懒

✔ 协程 ≠ 消灭耗时

真正的分界线只有一条:

能不能在执行过程中"让出线程"


九、一句话面试必杀总结

你现在可以这样说(非常加分):

协程只能在挂起点让出线程,普通阻塞代码即使在协程里也会真实占用线程。

kotlin == ===

== 是比较值是否相等。相当于java里面的equel

=== 是比较是否为同一个对象而不仅仅是值是否相等,相当于java里面的==

kotlin 中的val和const以及 const val

val 是运行期常量,const val 是编译期常量,const 只能修饰 val,不能单独存在。

const x = 10 // ❌ 编译错误

const val TAG = "AppStoreActivity"

const val KEY_USER_ID = "user_id"

Java 中直接变成:

java

复制代码

public static final String TAG = "AppStoreActivity";

java和kotlin里面的?:

java里面?:是三目运算

int max = a > b ? a : b;

kotlin

表达式1 ?: 表达式2

含义:

如果 表达式1 != null → 返回它

如果 表达式1 == null → 返回表达式2

val name = user?.name ?: ""

等价 Java:

java

复制代码

String name = user != null ? user.getName() : "";

配合安全调用

kotlin

复制代码

val length = text?.length ?: 0

抛异常(Kotlin 惯用)

kotlin

复制代码

val user = intent.getParcelableExtra<User>("user")

?: throw IllegalArgumentException("user is null")

相关推荐
gjxDaniel18 小时前
Kotlin编程语言入门与常见问题
android·开发语言·kotlin
野生技术架构师1 天前
Java 21虚拟线程 vs Kotlin协程:高并发编程模型的终极对决与选型思考
java·开发语言·kotlin
言之。1 天前
Kotlin快速入门
android·开发语言·kotlin
常利兵1 天前
Android Gradle 构建脚本现代化:Kotlin DSL (.kts) 与 Groovy DSL 深度对比与实战指南
android·开发语言·kotlin
baidu_247438611 天前
Android kotlin 定时n秒完成时回调,含暂停和继续
android·kotlin
stevenzqzq1 天前
kotlin和compose中使用by
kotlin·compose
符哥20081 天前
Android 开发中如何使用Coroutines
android·kotlin
sinat_267611912 天前
跟着官网学习协程随笔
学习·kotlin
缺一句感谢和缺一句道歉2 天前
Module was compiled with an incompatible version of Kotlin.
java·kotlin
灯火不休ᝰ2 天前
[安卓] Kotlin中的架构演进:从MVC到MVVM
android·架构·kotlin