Kotlin——数组

作者: So_ProbuING | 来源:发表于2021-04-26 13:42 被阅读0次

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}")
    }
}

相关文章

网友评论

    本文标题:Kotlin——数组

    本文链接:https://www.haomeiwen.com/subject/ylisrltx.html