持有可空类型元素和持有非空类型元素的集合

变量自己类型的可空性和用作类型参数 类型 的可空性是有区别的

集合中是允许可空值的。

只读集合和可变集合

kotlin将访问集合的接口和访问数据的接口分开了。

可变集合继承自只读集合,只读集合不可修改,可变集合在只读集合的基础上增加了添加,移除元素,清空集合等方法。

一般的规则是,在代码中都应该使用只读集合。只有在需要修改的地方才使用可变接口的变体。这在函数中接受参数时也更明确了什么什么集合是可修改的,什么时候只适用于读取。
只读集合不能传递给可变集合,但是可变集合可以传递给只读集合


所以只读集合也并不总是线程安全的,在多线程环境下处理数据,需要保证代码的正确同步关系。

kotlin集合和java

每一个kotlin接口都是对应java集合接口的一个实例。在kotlin和java之间转移并不需要转化:

map也并没有继承自Collection和Iterable
他也被表示为两种类型:只读和可变

java操作kotlin集合

因为java不会区分可变和只读集合,所以从java调用kotliln的集合时,kotlin编译器不会拒绝java代码对集合做了什么,即便对只读集合进行了修改。
对于非空类型也需要注意,在kotlin中声明了是非空类型,但是在java中仍然有可能会添加空值进去,所以需要对他进行单独的处理。

kotlin操作java集合

需要根据实际情况给他添加上适当的约束,如是否可空,可变等。

对象和基本数据类型的数组

kotlin最常用的创建数组的情况之一是需要调用参数为数组的java方法。或是带有vararg参数的kotlin函数。通常情况下,数据已经存储在集合中,只需将其转化为数组即可。可以使用toTypeArray方法把他转为数组。然后数组可以通过*对他进行展开。转变为vararg的参数。
数组类型的类型参数始终会变成对象类型
因为大部分创建数组或者集合时,都是使用的泛型类,对于泛型,必然是对象类型进行存储。而在kotlin中,他提供了一些单独的类,用来专门存储基础数据类型的数组,如IntArray,ByteArray,BooleanArray等。这些都可以编译为java中的基本类型数组byte[],int[]等