Kotlin中asReversed()与reversed()的区别是什么?
Kotlin中reversed()和asReversed()的核心差异
嘿,这个问题问得特别到位!很多刚接触Kotlin集合的同学都会被这两个方法搞混——它们看起来都是反转集合,但底层逻辑和适用场景其实差得挺远的,下面给你掰扯清楚:
1. 核心行为本质不同
reversed():返回全新的独立集合
调用这个方法时,Kotlin会把原集合的元素完整复制一份,然后倒序排列成一个新集合。这个新集合和原集合完全独立,后续修改原集合不会影响它,修改它也不会牵连原集合。
举个实际例子:val original = mutableListOf(1, 2, 3) val reversedList = original.reversed() original.add(4) // 原集合添加元素 println(reversedList) // 输出 [3, 2, 1],完全不受原集合修改影响asReversed():返回原集合的反转视图
这个方法不会创建新集合,而是返回一个“镜像”原集合的视图。所有对原集合的修改,都会实时反映在这个视图里;反过来,如果原集合是可变的,通过这个视图修改元素,也会直接改变原集合。
同样看例子:val original = mutableListOf(1, 2, 3) val reversedView = original.asReversed() original.add(4) // 原集合添加元素 println(reversedView) // 输出 [4, 3, 2, 1],视图同步更新 // 甚至可以通过视图修改原集合 reversedView[0] = 5 println(original) // 输出 [1, 2, 3, 5],原集合的最后一个元素被修改
2. 适用场景不一样
- 用
reversed()的情况:你需要一个和原集合完全脱钩的反转集合,后续要独立操作它,或者不想原集合的变化影响反转结果。 - 用
asReversed()的情况:想节省内存(不用复制元素),并且希望反转后的结果和原集合保持同步;另外对于不可变集合(比如只读List),asReversed()比reversed()更高效,因为不需要复制元素。
补充:不可变集合的特殊情况
如果原集合是不可变的List(只读),asReversed()返回的是只读的反转视图,因为原集合不能修改,所以视图也不会变化,这时候和reversed()的最终表现类似,但asReversed()更节省内存,因为没有复制过程。
内容的提问来源于stack exchange,提问作者Quinn
相关产品推荐
相关产品推荐

