只读集合是型变的,可变集合不是型变的

只读集合类型是型变的。 这意味着,如果类 Rectangle 继承自 Shape,则可以在需要 List <Shape> 的任何地方使用 List <Rectangle>。 换句话说,集合类型与元素类型具有相同的子类型关系。 map 在值(value)类型上是型变的,但在键(key)类型上不是。
反之,可变集合不是型变的;否则将导致运行时故障。 如果 MutableList <Rectangle>MutableList <Shape> 的子类型,你可以在其中插入其他 Shape 的继承者(例如,Circle),从而违反了它的 Rectangle 类型参数。

这里很容易理解,因为只读集合是只读的,所以他才能支持型变

在 Kotlin 中,List 的默认实现是 ArrayList

  1. @SinceKotlin("1.1") public actual typealias ArrayList<E> = java.util.ArrayList<E>
  2. @SinceKotlin("1.1") public actual typealias LinkedHashMap<K, V> = java.util.LinkedHashMap<K, V>
  3. @SinceKotlin("1.1") public actual typealias HashMap<K, V> = java.util.HashMap<K, V>
  4. @SinceKotlin("1.1") public actual typealias LinkedHashSet<E> = java.util.LinkedHashSet<E>
  5. @SinceKotlin("1.1") public actual typealias HashSet<E> = java.util.HashSet<E>

kotlin是可以直接调用java代码的,所以直接依赖一个java中的类也是可以理解的

复制

要创建与现有集合具有相同元素的集合,可以使用复制操作。标准库中的集合复制操作创建了具有相同元素引用的 复制集合。 因此,对集合元素所做的更改会反映在其所有副本中。
在特定时刻通过集合复制函数,例如toList()toMutableList()toSet() 等等。创建了集合的快照。 结果是创建了一个具有相同元素的新集合 如果在源集合中添加或删除元素,则不会影响副本。副本也可以独立于源集合进行更改。

集合的初始化可用于限制其可变性。例如,如果构建了一个 MutableListList 引用,当你试图通过此引用修改集合的时候,编译器会抛出错误。

val sourceList = mutableListOf(1, 2, 3)
val referenceList: List<Int> = sourceList
//referenceList.add(4)            // 编译错误
sourceList.add(4)
println(referenceList) // 显示 sourceList 当前状态

**

可变迭代器

为了迭代可变集合,于是有了 MutableIterator 来扩展 Iterator 使其具有元素删除函数 remove() 。因此,可以在迭代时从集合中删除元素。

val numbers = mutableListOf("one", "two", "three", "four") 
val mutableIterator = numbers.iterator()
mutableIterator.next()
mutableIterator.remove()    
println("After removal: $numbers")
Target platform: JVMRunning on kotlin v. 1.3.72

**
除了删除元素, MutableListIterator 还可以在迭代列表时插入和替换元素。

val numbers = mutableListOf("one", "four", "four") 
val mutableListIterator = numbers.listIterator()
mutableListIterator.next()
mutableListIterator.add("two")
mutableListIterator.next()
mutableListIterator.set("three")   
println(numbers)

**