《Kotlin从小白到大牛》第16章:数据容器——数组和集合

第16章 数据容器——数组和集合

当你有很多书时,你会考虑买一个书柜,将你的书分门别类摆放进入。使用了书柜不仅仅使房间变得整洁,也便于以后使用书时方便查找。在计算机程序中会有很多数据,这些数据也需要一个容器将它们管理起来,这就是数据容器。
数据容器本质是基于某种数据结构,常见的数据结构:数组(Array)、集(Set)、队列(Queue)、链表(Linkedlist)、树(Tree)、堆(Heap)、栈(Stack)和映射(Map)等结构。Kotlin中数据容器主要分为数组和集合。

16.1 数组

数组(Array)是一种最基本的数据结构,数组具有如下三个基本特性:
1.一致性。数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。
2.有序性。数组中的元素是有序的,通过下标访问,数组下标从零开始的。
3.不可变性。数组一旦初始化,则长度(数组中元素的个数)不可变。
为兼容Java中数组和提供访问效率,Kotlin中数组分为:对象数组和基本数据类型数组。

16.1.1 对象数组
Kotlin对象数组是Array,其中只能保存“对象”,这里所说的“对象”是指Java中的“对象”。
在这里插入图片描述
在这里插入图片描述
Kotlin中创建对象数组有三种方式:
o arrayOf(vararg elements: T)工厂函数。指定数组元素列表创建元素类型为T的数组,vararg表明参数个数是可变的。
o arrayOfNulls(size:Int)函数。size参数指定数组大小,创建元素类型为T的数组,数组中的元素为空值。
o Array(size: Int, init: (Int)-> T)构造函数。通过size参数指定数组大小,init参数指定一个用于初始化元素的函数,实际使用时经常是Lambda表达式。
下面通过示例介绍一下几种创建对象数组的不同方式:
//代码文件:chapter16/src/com/a51work6/section1/ch16.1.1.kt
package com.a51work6.section1

fun main(args: Array) {

// 静态初始化
val intArray1 = arrayOf(21, 32, 43,45)                           ①
val strArray1 = arrayOf("张三", "李四", "王五", "董六")     ②

// 动态初始化
val strArray2 =arrayOfNulls<String>(4)        ③
// 初始化数组中元素
strArray2[0] = "张三"
strArray2[1] = "李四"
strArray2[2] = "王五"
strArray2[3] = "董六"
val intArray2 = Array<Int>(10){ i -> i * i }//可以使用{ it * it }替代               ④
val intArray3 = Array<Int?>(10){ it * it * it } //可以使用{ i -> i * i * i }替代    ⑤

//遍历集合
for (item in intArray2) {             ⑥
    println(item)
}
for (idx in strArray1.indices) {     ⑦
   println(strArray1[idx])
}

}
输出结果如下:
0 1 4 9 16 25 36 49 64 81
张三 李四 王五 董六

上述代码第①行和第②行是使用arrayOf工厂函数创建数组,编译器根据元素类型推导出数组类型。arrayOf函数参数是可变参数,是一个元素列表,称为“静态初始化”,静态初始化是在已知数组的每一个元素内容情况下使用的。很多情况下数据是从数据库或网络中获得的,在编程时不知道元素有多少,更不知道元素的内容,此时可采用动态初始化。代码第③行arrayOfNulls函数,代码第④行和第⑤行的构造函数都属于动态初始化。在代码第③行指定数组长度为4,数组类型是String,但此时虽然创建了一个数组对象,但是数组中的元素是空值,还需要初始化数组中的每一个元素。代码第④行是通过构造函数创建10个元素Int数组,{ i -> i * i }是Lambda表达式用来为一个元素赋值。代码第⑤行是通过构造函数创建10个元素Int?(元素为可空的)数组,{ it * it * it }是Lambda表达式用来为一个元素赋值,it是隐式参数。
代码第⑥行和代码第⑦行是变量数组,如果关系数组下标,可以使用代码第⑥行的for运行进行变量数组。代码第⑦行数组的indices属性可以返回数组下标索引范围。
在这里插入图片描述
16.1.2 基本数据类型数组
Kotlin编译器将元素是基本类型的Kotlin对象数组编译称为Java包装类数组,这样Java包装类数组与Java基本类型数组相比,包装类数组数据存储空间占用大,运算效率差。为此,Kotlin提供8基本数据类型数组,Kotlin编译将这些基本数据类型数组编译为Java基本数据类型数组,例如Kotlin基本数据类型数组IntArray编译为Java数组int[]。
Kotlin基本数据类型数组与Java基本数据类型数组对应关系如表16-2所示:
在这里插入图片描述
每一个基本数据类型数组的创建都有三种方式,下面以Int类型为例介绍一下:
o intArrayOf(vararg elements:Int)工厂函数。通过对应的工厂函数,vararg表明参数是可变参数,是Int数据列表。
o IntArray(size: Int)构造函数。size参数指定数组大小创建元素类型为Int的数组,数组中的元素为该类型默认值,Int的默认值是0。
o IntArray(size: Int, init: (Int)-> Int)构造函数。通过size参数指定数组大小,init参数指定一个用于初始化元素的函数,参数经常使用Lambda表达式。
下面通过一个示例介绍一下基本数据类型数组:
//代码文件:chapter16/src/com/a51work6/section1/ch16.1.2.kt
package com.a51work6.section1
fun main(args: Array) {
// 静态初始化
val array1 = shortArrayOf(20, 10, 50,40, 30) ①
// 动态初始化
val array2 = CharArray(3) ②
array2[0] = ‘C’
array2[1] = ‘B’
array2[2] = ‘D’
// 动态初始化
val array3 = IntArray(10) { it * it } ③
//遍历集合
for (item in array3) { ④
println(item)
}
println()
for (idx in array2.indices) { ⑤
println(array2[idx])
}
}
上述代码第①行采用shortArray工厂函数创建Short类型数组。代码第②行采用构造函数创建Char数组,该语句虽然创建了Char数组,但是其中的元素都是Char的默认值空字符,空字符需要使用Unicode编码’\u0000’表示。代码第③行是通过构造函数创建10个元素Int数组,{ i -> i * i }是Lambda表达式用来为一个元素赋值。
通过上面的示例会发现比较对象数组和基本数据类型数组的创建过程都有三种类似方式。

16.2 集合概述

Kotlin中提供了丰富的集合接口和类,如图16-1所示是Kotlin主要的集合接口和类,从图中可见Kotlin集合类型分为:Collection和Map,MutableCollection是Collection的可变的子接口,MutableMap是Map的可变的子接口。此外,Collection还有两个重要的子接口:Set和List,它们都有可变接口MutableSet和MutableList。这些接口来自于kotlin.collections包。
从图16-1中可见

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值