数据类型
数值类型
- Byte=> 字节 => 8位
- Short => 短整型 => 16位
- Int => 整型 => 32位
- Long => 长整型 => 64位
- Float => 浮点型 => 32位
- Double => 双精度浮点型 => 64位
布尔类型
关键字: Boolean 长度1位 范围: true 或者 false
示例:
var bool : Boolean = true
字符型
Char 长度4位, 范围-128 ~ 127 用 ’ ’ 表示
示例:
val value : Char = 'A'
字符串类型
Kotlin中的字符串由String类表示。字符串是不可变的,这意味着无法更改String中的元素。
示例:
var str : String = "kotlin"
字符串操作详看另一篇字符串详解
数组类型
Kotlin中的数组由Array类表示。使用库函数arrayOf()和Array()构造函数创建数组。 Array有get(),set()函数,size属性以及一些其他有用的成员函数
使用库函数arrayOf()创建数组
arrayOf()函数创建包装类型数组。 item值在arrayOf()函数内传递,如arrayOf(1,2,3),它创建一个数组[1,2,3]。
通过索引值(array [index])访问数组的元素。数组索引从0开始。
val id = arrayOf(1,2,3,4,5) = [1,2,3,4,5]
val firstId = id[0]
val lasted = id[id.size-1]
使用Array()构造函数创建数组
用Array()构造函数创建数组时,需要在Array()构造函数中使用两个参数:
- 第一个参数作为数组的大小
- 第二个参数作为函数,用于初始化并返回给定索引的数组元素的值。
val asc = Array(5, { i -> i * 2 }) = [0,2,4,6,8]
数值比较
判断两个数值是否相等(),判断两个数值在内存中的地址是否相等(=),其实上面的装箱操作之后其内存中的地址根据其数据类型的数值范围而定。
示例:
val numValue: Int = 128
val numValueBox: Int? = numValue
/*
比较两个数字
*/
var result: Boolean
result = numValue == numValueBox
println("numValue == numValueBox => $result") // => true,其值是相等的
result = numValue === numValueBox
/*
上面定义的变量是Int类型,大于127其内存地址不同,反之则相同。
这是`kotlin`的缓存策略导致的,而缓存的范围是` -128 ~ 127 `。
故,下面的打印为false
*/
println("numValue === numValueBox => $result"
输出:
numValue == numValueBox => true
numValue === numValueBox => false
装箱,拆箱
kotlin中存在装箱,不存在拆箱
在Java中,通过装箱和拆箱在基本数据类型和包装类型之间相互转换。而Kotlin中,所有变量的成员方法和属性都是对象,当需要一个可为 null 的引用时, 就会触发装箱操作, 装箱操作不保持对象的同一性。
val a: Int? = 1000//装箱
val b: Int = 1000
val c: Int=1000
println(a === b)//结果为false
println(b === c)//结果为true
类型转换
类型转换是将一个数据类型变量转换为另一种数据类型的过程。 在Kotlin中,不支持将较小数据类型隐式转换为较大数据类型(在java中支持)。 例如,Int不能分配转换为Long或Double。
- 在Java语言中
int value1 = 10;
long value2 = value1; // 有效
- 在Kotlin语言中
var value1 = 10
val value2: Long = value1 // 编译错误,类型不匹配
但是在Kotlin中,转换是通过显式进行的,较小的数据类型可转换为较大的数据类型,反之亦然。但它是通过使用辅助函数完成的。
var value1 = 10
val value2: Long = value1.toLong()
- Kotlin中用于数字转换的辅助函数列表如下:
- toByte() => 转换为字节型
- toShort() => 转换为短整型
- toInt() => 转换为整型
- toLong() => 转换为长整型
- toFloat() => 转换为浮点型
- toDouble() => 转换为双精度浮点型
- toChar() => 转换为字符型
- toString() => 转换为字符串型