如答案https://stackoverflow.com/a/57115894/3286489中所述,asReversed()将生成一个反向列表,如果原始列表中的元素已更改,则该值将更改。

    val list = mutableListOf(0, 1, 2, 3, 4, 5)
    val asReversed = list.asReversed()
    val reversed   = list.reversed()
    println("Original list: $list")
    println("asReversed:    $asReversed")
    println("reversed:      $reversed")

    list[0] = 10

    println("Original list: $list")
    println("asReversed:    $asReversed")
    println("reversed:      $reversed")

产出
Original list: [0, 1, 2, 3, 4, 5]
asReversed:    [5, 4, 3, 2, 1, 0]
reversed:      [5, 4, 3, 2, 1, 0]
Original list: [10, 1, 2, 3, 4, 5]
asReversed:    [5, 4, 3, 2, 1, 10]
reversed:      [5, 4, 3, 2, 1, 0]

对我来说,这意味着仅当原始列表是MutableList时,它才能在其中更改其值。

但是,如果原始List是一个不变的List,则它的值无法更改,这本质上使asReversed()reversed()没有明显区别,对吧?


    val list = listOf(0, 1, 2, 3, 4, 5)
    val asReversed = list.asReversed() // This is the same as below?
    val reversed   = list.reversed()   // This is the same as above?

我有没有想过它们仍然不同的情况?

更新了
我什至更改了它包含的mutableList
     val list = listOf(
            mutableListOf(1),
            mutableListOf(2),
            mutableListOf(3),
            mutableListOf(4),
            mutableListOf(5),
            mutableListOf(6))
        val asReversed = list.asReversed()
        val reversed   = list.reversed()
        println("Original list: $list")
        println("asReversed:    $asReversed")
        println("reversed:      $reversed")

        list[0][0] = 10

        println("Original list: $list")
        println("asReversed:    $asReversed")
        println("reversed:      $reversed")

输出量
Original list: [[1], [2], [3], [4], [5], [6]]
asReversed:    [[6], [5], [4], [3], [2], [1]]
reversed:      [[6], [5], [4], [3], [2], [1]]
Original list: [[5], [2], [3], [4], [5], [6]]
asReversed:    [[6], [5], [4], [3], [2], [10]]
reversed:      [[6], [5], [4], [3], [2], [10]]

这对于asReversedreversed结果都会改变

最佳答案

两者之间最重要的区别是,asReversed始终只是原始列表上的 View 。这意味着,如果更改原始列表,则asReversed的结果将始终包含所有更新的信息。最后,这只是一个 View 。
reversed始终为您提供原始列表的新断开连接列表。但是请注意,当您处理原始列表中的对象引用(例如列表中的列表或其他类型的可引用对象)时,您将看到该列表中原始对象的所有改编也以相反的形式改编,无论是使用reversed还是asReversed

关于更新,很遗憾,您使用了这样的包含参考的列表。但是,与原始列表相比,区别更加明显:

val asReversed = list.asReversed()
val reversed = list.reversed()

fun printAll(msg : String) {
  println(msg)
  println("Original list: $list")
  println("asReversed:    $asReversed")
  println("reversed:      $reversed")
}
printAll("Initial ----")

list as MutableList
list[2] = 1000
printAll("mutating original list ----")

reversed as MutableList
reversed[4] = 3000
printAll("mutating reversed list ----")

由于asReversed返回的是ReversedListReadOnly类型,因此您无法轻松将其转换为MutableList,但是如果可能的话,asReversed中的更改将反射(reflect)在原始列表中,而不是reversed中。上面的输出如下:
Initial ----
Original list: [0, 1, 2, 3, 4, 5]
asReversed:    [5, 4, 3, 2, 1, 0]
reversed:      [5, 4, 3, 2, 1, 0]
mutating original list ----
Original list: [0, 1, 1000, 3, 4, 5]
asReversed:    [5, 4, 3, 1000, 1, 0]
reversed:      [5, 4, 3, 2, 1, 0]
mutating reversed list ----
Original list: [0, 1, 1000, 3, 4, 5]
asReversed:    [5, 4, 3, 1000, 1, 0]
reversed:      [5, 4, 3, 2, 3000, 0]

如您所见:更改很好地反射(reflect)在原始列表和asReversed -list中,但是reversed的更改未反射(reflect)出来,并且相反的更改将不包含原始列表改编。

所以,是的,您可能会错过这种情况...列表(reversedasReversed)不相等,即使您输入的是只读 View 也不相等,因为没有人可以保证您列表不会被更改。 。既不是原始的也不是asReversed之一。

07-27 17:31