笔记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")

相关推荐
btown2 天前
Kotlin 版 MyBatis-Plus 查询优雅解决方案
kotlin
小二·2 天前
车载数字座舱实战:用魔珐星云打造下一代智能驾乘助手(附 Android/Kotlin 完整代码)
开发语言·kotlin
我命由我123452 天前
Android 开发问题:java.lang.NoSuchMethodError:No virtual method readAllBytes()
android·java·java-ee·kotlin·android studio·android-studio·android runtime
Kapaseker2 天前
你是不是还没用过 select?实战 Kotlin select
android·kotlin
plainGeekDev3 天前
synchronized → Coroutines
android·java·kotlin
唐青枫3 天前
Java Gradle 实战指南:从 Wrapper、Kotlin DSL 到 Spring Boot 多模块构建
java·kotlin·gradle
帅次4 天前
Kotlin Flow 与 StateFlow:UI 单向数据流基础
开发语言·ui·kotlin·stateflow·onlifecycle
Kapaseker4 天前
Sequence 一定比 List 快?等等,我们先从基础讲起
android·kotlin
zhangjin11205 天前
Android Studio创建HelloWorld(kotlin版本)
android·kotlin·android studio
怣疯knight5 天前
kotlin安卓应用打包编译卡死的可能原因
android·kotlin