求kotlinx.collections.immutable中Persistent与Immutable集合的区别示例
Kotlinx.collections.immutable 中 Persistent 与 Immutable 集合的区别示例
Persistent集合只能通过更新底层数据结构的指针来修改,这些指针会将集合未受影响的部分与新更新的部分链接起来。而Immutable集合在任何情况下都无法被修改,一旦创建,其内容就固定不变。
1. Immutable 集合示例
Immutable 集合是纯粹的只读集合,没有任何可修改自身的方法,创建后内容完全固定。所有尝试修改的操作要么编译报错,要么只能生成新的普通集合,原 Immutable 集合始终保持不变。
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf fun main() { // 通过Persistent集合转换得到ImmutableList val immutableList: ImmutableList<String> = persistentListOf("A", "B", "C").toImmutable() // 尝试调用add、remove等修改方法会直接编译报错 // immutableList.add("D") // immutableList.removeAt(0) // 仅支持读取操作 println("原Immutable集合: $immutableList") // 输出: [A, B, C] // 只能通过复制为可变集合来修改,但原集合不受影响 val mutableCopy = immutableList.toMutableList() mutableCopy.add("D") println("可变副本: $mutableCopy") // 输出: [A, B, C, D] println("原Immutable集合仍不变: $immutableList") // 输出: [A, B, C] }
2. Persistent 集合示例
Persistent 集合属于 Immutable 集合的高性能实现,它本身也不可变,但提供了特殊的"修改"方法——这些方法不会改变原集合,而是返回一个新的 Persistent 集合,并且底层会复用原集合未变更的部分(通过指针链接),避免全量复制,性能更优。
import kotlinx.collections.immutable.persistentListOf fun main() { // 创建PersistentList实例 val originalList = persistentListOf("A", "B", "C") println("原Persistent集合: $originalList") // 输出: [A, B, C] // 调用add方法,返回新的PersistentList,原集合完全不变 val addedList = originalList.add("D") println("原集合仍不变: $originalList") // 输出: [A, B, C] println("添加元素后的新集合: $addedList") // 输出: [A, B, C, D] // 调用remove方法,再次返回新实例,底层复用未修改的节点 val removedList = addedList.removeAt(1) println("添加后的集合仍不变: $addedList") // 输出: [A, B, C, D] println("移除元素后的新集合: $removedList") // 输出: [A, C, D] // 验证实例独立性:原集合与新集合是不同实例,但底层共享未修改部分 println("原集合与添加后的集合是否为同一实例: ${originalList === addedList}") // 输出: false }
核心区别总结
- Immutable 集合:完全只读,无修改接口,只能通过复制为可变集合间接修改,原集合永久不变。
- Persistent 集合:Immutable 集合的特殊实现,提供"伪修改"方法(返回新集合),底层复用原集合未变更部分,兼顾不可变性与性能。
内容的提问来源于stack exchange,提问作者me.at.coding
相关产品推荐
相关产品推荐

