Kotlin 数组和集合
Kotlin为数组增加了一个Array类。为元素是基本类型的数组增加了XxxArray类(其中Xxx可以是Byte、Short、Int等基本类型)
Kotlin自己提供了一套集合体系,Kotlin的集合体系抛弃了Java集合体系中的Queue集合,Kotlin集合体系中增加了可变集合和不可变集合。
Kotlin中的集合体系
- List代表有序可重复的集合
- Set代表无序不可重复集合
- Map代表key-value形式的集合
Kotlin数组
Kotlin的数组使用Array<T>来代表,Kotlin的数组就是一个Array类的实例,因此Kotlin数组是引用类型
Kotlin数组的创建
- 通过Array<T>的构造器创建实例
- 通过arrayOf()等工具函数创建实例
fun arraysCreate(){
//创建包含指定元素的数组,相当于Java的静态初始化
var arr1 = arrayOf("java", "c", "c++", "python")
//创建指定长度、数组中元素为null的数组,相当于java的动态初始化
var arr2 = arrayOfNulls<Int>(5)
var arr3 = arrayOfNulls<Double>(4)
//创建长度为0的数组
var arr4 = emptyArray<Short>()
}
- arrayOf()函数:这种方式无须显式指定数组长度,但需要依次列出每个数组元素。这种方式kotlin可以推断出数组的元素类型,所以不需要使用泛型指定元素类型
- arrayOfNulls()函数:这种方式需要显式指定数组的长度,数组元素全部被初始化为null,kotlin无法推断出元素的类型,所以需要在arrayOfNulls()函数上使用泛型来指定数组元素的类型
- emptyArray()函数:这种方式会创建一个长度为0的空数组。由于没有指定数组元素类型,需要使用泛型来指定数组元素的类型
- Array(size:Int,init:(int)->T):显式指定数组长度。并可通过lambda表达式来动态计算各个数组元素的值
Array<T>类要求它的元素必须是引用类型,因此,如果将基本类型的值存入Array<T>中,Kotlin会将这些基本类型的值自动装箱成包装类的实例,然后添加到Array<T>数组中
为此kotlin专门提供了
ByteArray、ShortArray、IntArray、LongArray、CharArray、FloatArray、DoubleArray、BooleanArray 分别用于映射Java的byte[]、short[]、int[]、long[]、char[]、float[]、double[]、boolean[]
创建这些数组的方式也与前面介绍的相同 提供XxxArray方法
//创建指定类型的数组
//int
var arr6 = intArrayOf(1, 2, 3, 4)
//double
var arr7 = doubleArrayOf(1.0, 2.0, 3.0, 4.0)
//char
var arr8 = charArrayOf('a', 'b', 'c')
- 使用创建指定类型的方式创建数组,可采用列出数组元素的方式来创建数组,但不支持创建指定数组元素的null数组,因为基本类型的元素不允许为null
数组的使用
数组的访问
访问数组是通过在数组的索引后跟一个[]来实现,方括号中的值是数组元素的索引值。kotlin中的[]运算值其实是get(index)、set(index,value)方法,使用[]访问数组元素,调用的其实就是get(index)方法,使用[]为数组元素赋值,调用的其实就是set(index,value)方法
/*
访问数组元素
*/
fun visitArrayValue() {
var arr1 = arrayOf("kotlin", "java", "python")
//使用两种方式获取数组元素
println(arr1[0])
println(arr1.get(0))
//使用两种方式修改数组元素
arr1[1] = "noJava"
arr1.set(1,"nojava")
println(Arrays.toString(arr1))
}
上面的两种方式本质是一样的,在经过编译器编译优化后,会转换成根据数组的内存地址来访问数组元素,性能不会有任何损失
所有的数组都有size
属性,通过这个属性可以访问到数组的长度。
for- in 循环遍历数组
for-in 循环可以自动遍历数组的每个元素
fun forinArrays() {
var books = arrayOf("java编程思想", "疯狂kotlin", "linux从入门到放弃")
for (book in books) {
println(book)
}
}
对数组使用for-in循环会被编译成使用基于索引的循环,并不会创建迭代器。因此具有良好的性能
使用数组索引
kotlin数组提供了一个indices属性,这个属性可返回数组的索引区间
for (i in books.indices) {
println(books[i])
}
这种通过索引区间遍历的实现具有更好的性能,kotlin将会在底层将其编译成根据内存地址来访问元素,不需要额外创建区间对象
Kotlin还为数组提供了一个lastIndex属性,该属性用于返回数组最后一个元素的索引,size-1
如果需要同时访问数组的索引和元素,可以使用数组的withIndex()
,该方法返回一个Iterable对象,该对象的所有元素都是IndexedValue.
fun withIndex() {
var motos = arrayOf("gsxr1000","cbr650r","s1000rr")
for ((index, value) in motos.withIndex()) {
println( "${index}=======${value}")
}
}
网友评论