Kotlin严格区分可变集合和不可变集合,要清楚的一点是,区分开可变集合的只读视图与实际上真正不可变的集合
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main20)
var stringList: MutableList<String> = mutableListOf("hello", "world", "hello world")
val readOnlyView: List<String> = stringList
println(stringList)
stringList.add("welcome")
println(readOnlyView)
}
这样是编译不通过的,如果我删除掉List<String>
就可以编译通过了,readOnlyView变成了mutableListOf,变成了可变集合,是有clear 、add方法的
List : 本身是不可变的集合
MutableList:是可变的集合
所以stringList是可变集合,readOnlyView是一个可变集合的只读视图,
下图是Kotlin集合接口的图表:
不可变集合:List Set Map
可变集合:MutableList MutableSet MutableMap
val setString: HashSet<String> = hashSetOf("a", "b", "c", "d", "c")
println(println(setString))
HashSet会去掉重复元素
只读类型是协变的,因为它只用于从集合中只获取数据,不会修改数据。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main20)
val string = listOf<String>("a", "b")
val string2: List<Any> = string
}
根据协变,子类型的可以赋给父类型的
快照
要创建与现有集合具有相同元素的集合,可以使用快照操作
在特定时刻通过集合复制函数,例如toList()
、toMutableList()
、toSet()
等等。创建了集合的快照。 结果是创建了一个具有相同元素的新集合 如果在源集合中添加或删除元素,则不会影响副本。副本也可以独立于源集合进行更改。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main20)
val items1 = mutableListOf("a", "b", "c")
val items2 = items1.toList()
items1.add("d")
println(items1)
println(items2)
}
toList()
是一个扩展方法,只是复制元集合中的元素,所以返回来的集合就可以确保不会发生变化