Kotlin学习之集合

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()是一个扩展方法,只是复制元集合中的元素,所以返回来的集合就可以确保不会发生变化

猜你喜欢

转载自blog.csdn.net/jingerlovexiaojie/article/details/107726405