在上面的图中,我们能够清晰的看到,kotlin 的基本数据类型包括 数值、字符、字符串、布尔类型、数组。接下来,我们就一一了解这些类型。
一、数值
在开篇的图中我们可以知道,数值的具体类型有如下几种:
类型 | 含义 | 位宽 | 取值范围(最小值~最大值) |
---|---|---|---|
Byte | 整数 | 8 | -128 ~ 127 |
Short | 整数 | 16 | -32768 ~ 32767 |
Int | 整数 | 32 | -2147483648 ~ 2147483647 |
Long | 整数 | 64 | -9223372036854775808 ~ 9223372036854775807 |
Float | 单精度小数 | 32 | 1.4E-45 ~ 3.4028235E38 |
Double | 双精度小数 | 64 | 4.9E-324 ~ 1.7976931348623157E308 |
1、数值的表示方式
- Long 类型数据通常会在末尾加 L 或 l 后缀,如 123L,123l,建议用L
- Float 类型数据通常会在末尾加 F 或 f 后缀,如 12.3F,12.3f, 如果一个小数 不加后缀 F 或 f , 则默认为是 Double类型
- kotlin中的数值可以用二进制、十进制、十六进制表示,但 不支持八进制!!。所以 十进制的 3 可以用如下三种方式表示:
二进制: 0b00000011
十进制: 3
十六进制: 0x3
2、用下划线增加大数据的易读性
先来看这么一个数据, 1234500000,这是 十二亿三千四百五十万, 我们看到这么一个数据的时候,基本都会去挨个的从左到右的数,个十百千万十万百万千万亿,然后才知道这个数据到底是多少。
对于例子中这种值比较大的数据,我们读起来很费劲,但是,kotlin 1.1 版本之后我们可以使用 下划线 _ 来链接较大的数值 ,我们可以每隔三位或者四位加一个下划线,这样,我们在读数据的时候就能一路了然了。
示例如下:
代码语言:javascript复制val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
3、数值的类型转换
(1)、显示类型转换
先来看一段代码:
在上图中,我们看到,当我们将 Byte 类型的 a 赋值给 Int 类型的 b 时程序爆红了,那么我们该怎么解决呢?很简单:a.toInt( ),参考下图:
那么,如果我将 Int 数据赋值给 Byte 呢?
瞧,还是报错,那么怎么解决呢?a.toByte()
通过上面的示例我们可以得出如下结论:
当不同数据类型的变量之间进行赋值时,必须进行类型转换。 所以,kotlin给我们提供了如下转换方法:
方法名 | 作用 |
---|---|
toByte() | 将数据转为Byte类型 |
toShort() | 将数据转为Short |
toInt() | 将数据转为Int |
toLong() | 将数据转为 Long |
toFloat() | 将数据转为Float |
toDouble() | 将数据转为Double |
toChar() | 将数据转为Char |
toString() | 将数据转为String |
(2)、隐式类型转换
在上面的代码中,我们在代码中显示声明了 b 的类型,所以在给他赋值时,如果类型不一致则必须进行显示类型转换,但是,如果我们没有给 b 声明具体的类型呢?
瞧,没有在报错,这是因为类型推断的作用,这种情况下,b 的类型就是 a 的类型。
另外,在下面的代码中,也是一种隐式类型转换的模式。
代码语言:javascript复制val l = 1L 3 // Long Int => Long
其实,在这里的这个隐式类型转换,就是类型推断。
二、字符
- kotlin中字符用 Char 类型表示。
- 用 单引号 ‘ ’ 括起来的内容都是字符。
注意: 在 kotlin 中不能直接当作数字参与算术运算!!看下图:
在上图中,我们让 数值 3 和 字符 ‘1’ 直接进行算术运算,直接在 下面爆红了!!!意思就是说:char 不能直接参与算术运算,这点与 java 中的char 不同,java 中 每个 char 都有一个对应的数值,可以直接参与算术运算
但是,在kotlin中,如果我们想让 char 参与算术运算,需要先做类型转换,示例代码如下:
代码语言:javascript复制fun main(args: Array<String>) {
val b = 3 '1'.toInt()
print(b)
}
运行结果:
三、字符串
1、字符串的类型
- kotlin 中字符串用 String 类型表示。
- 用 一对双引号 “ ” ,或者 一对的三个引号 “”“ ”“” 括起来的内容就是字符串。
那么,用 “ ” 括起来的字符串和 “”“ ”“” 括起来的内容有什么区别呢?他们其实分别代表了两种字符串类型:转义型字符串 和 原样字符串(也可以叫原生或者原始字符串),
- 用 “ ” 括起来的内容称为 转义字符串,
- 用 “”“ ”“” 括起来的内容称为 原样字符串
(1)、原样字符串
原样字符串也可以叫做原始字符串或者原生字符串,其根本特点在于:
在打印原样字符串时,你输入的字符串是什么样的,它打印出来就是什么样的!
看示例代码:
代码语言:javascript复制fun main(args: Array<String>) {
val str = """ //这里使用 “”“ ”“” 创建了一个原生字符串
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
"""
println(str)
}
运行结果:
瞧,我们在创建字符串时使用了换行符让内容换行,打印的时候这些格式被保留了!这就是 原样字符串。
原样字符串的前导符
(2)、转义字符串
转义字符串就是支持转义字符的字符串。
还是 李白的《静夜思》,我们直接使用双引号加换行的方式创建一个字符串,如下:
代码语言:javascript复制fun main(args: Array<String>) {
val str2 = ""
"床前明月光," //使用换行时,系统自动用 将字符串链接了
"疑是地上霜,"
"举头望明月,"
"低头思故乡。" println(str2)
}
查看运行结果:
你看,虽然我们在创建字符串的使用手动敲击了键盘的回车,从外表看起来也像是换行了,但是打印出来其实是在一行的!!
那么,如果我们想用 转义字符串打印出 原始字符串的样子该怎么办呢?——用转义字符啊!,代码如下:
代码语言:javascript复制fun main(args: Array<String>) {
val str3 = " 床前明月光,n 疑是地上霜,n 举头望明月,n 低头思故乡。"
println(str3)
}
运行结果:
好了,到这里我想你就应该明白为什么它叫 转义字符串了吧?——支持转义字符,通过转义字符可以实现特殊的效果
但是,你也可能会想,原样字符串不支持转义字符么?是的,原样字符串不支持转义字符,不信你就看下面的代码:
代码语言:javascript复制fun main(args: Array<String>) {
val str = """
床前明月光,n
疑是地上霜。n
举头望明月, n
低头思故乡。 """
println(str) //原样字符串不支持转义字符
}
运行结果:
你看,换行符的转义符 n 直接被打印出来了。。。
2、获取字符串元素
字符串是由一个个的字符元素组成的,如果我们需要获取某个字符串中的元素有两种方式:
方式A:使用索引运算符访问
- 字符串中元素的索引 从 0 开始计数。
- 使用索引运算符获取元素的格式为: 字符串[i] 示例代码:
fun main(args: Array<String>) {
val str = "123456789"
val a = str[1] //使用索引运算符获取字符串中的元素
println(a)
}
方式B:用 for 循环迭代字符串 在 kotlin 中字符串也支持 for 循环,通过 for 循环我们也可以获取字符元素.
kotlin 中 for 循环的格式为 :
代码语言:javascript复制for (a in str){
//TODO sth
}
使用 for 循环迭代字符串的示例代码:
代码语言:javascript复制fun main(args: Array<String>) {
val str = "123456" //遍历 字符串中的内容 并打印出来
for (a in str) {
println(a)
}
}
运行结果:
3、字符串模板
(1)、字符串模板的标准写法
所谓的字符串模板,可以理解为一个占位符,这个占位符的值为实际传入的数据。
字符串模板 以 $ 开头,后面跟一个 { } ,{ } 中的内容可以是一个变量、方法或者一个运算式。
示例代码:
代码语言:javascript复制fun main(args: Array<String>) {
inputSth("abc")
}fun inputSth(content: String) {
println("传入方法的数据是:${content}") //字符串模板的使用
}
运行结果:
(2)、字符串模板的简写方式
我们再来看下面的代码:
代码语言:javascript复制fun main(args: Array<String>) {
inputSth("abc")
}fun inputSth(content: String) {
println("传入方法的数据是:$content,它的长度是 ${content.length}") //字符串模板的使用
}
细心的你可能已经发现了,这次的代码和上次的明显有区别,content 省略了大括号, 而后面的 {content.length} 并没有省略大括号,这是因为:
- 如果字符串模板中包裹的内容是单一的变量(或常量)可以省略大括号{ }
- 如果字符串模板中包裹的是表达式,则不能省略大括号
上面代码的运行结果:
4、字符串比较
(1)、== 和 equals(xx)
kotlin 中比较字符串有两种方式: == 和 .equals()
这两种方式都能比较字符串是否相同。看代码:
代码语言:javascript复制fun main(args: Array<String>) {
var str1 = "a"
var str2 = "a"
println(str1 == str2) //使用 == 判断字符串是否一致
println(str1.equals(str2)) // 使用 equals 判断字符串是否一致
}
运行结果:
通过上面的代码可知 :
kotlin 中 == 具有 与 .equals(XX) 相同的功能
(2)、equals(xx) 和 equals(xx , Boolean)
equals( xx ) 有一个重载方法 equals(xxx , Boolean) ,后面的Boolean表示 是否忽略大小写 ,true 忽略,false不忽略。equals(xx) 内部将Boolean赋值为false。看代码:
代码语言:javascript复制fun main(args: Array<String>) {
var str1 = "a"
var str2 = "A"
println(str1.equals(str2))
println(str1.equals(str2,true))
}
运行结果:
四、 布尔
布尔类型的关键字为 Boolean ,它有两个值:true 和 false。
布尔运算符有:
布尔运算符 | 含义 |
---|---|
ll | 短路逻辑或 |
&& | 短路逻辑与 |
! | 逻辑非 |
关于 与&、或 | 、非!不做过多解释了
五、数组
- Kotlin 中使用 Array 类来表示数组类型
- 它定义了 get() 和 set() 函数和 size 属性,以及一些其他有用的成员 函数,如:
class Array<T> private constructor() { val size: Int
operator fun get(index: Int): T
operator fun set(index: Int, value: T): Unit
operator fun iterator(): Iterator<T>
// ......
}
1、创建数组
(1)、使用 arrayOf() 创建数组并初始化元素
使用该方式创建的数组可以通过 set 方法修改元素,但是不能增加元素!
代码语言:javascript复制fun main(args: Array<String>) {
var arr1 = arrayOf(1, 2, 3, 4, 5) //创建一个指定元素的数组
println(arr1[0]) //打印0索引元素
}
(2)、 arrayOfNulls() 创建指定大小的空数组
使用该方式创建数组时需要指定数组元素个数以及元素类型,然后可以通过set 方法设置元素,但是元素个数不能超过设定的值
代码语言:javascript复制fun main(args: Array<String>) {
var arr2 = arrayOfNulls<Int>(5) //创建一个空数组,该数组接收的数据类型为 Int,最多能放入5个元素
arr2.set(0, 1)
arr2.set(1, 2)
arr2.set(2, 3)
arr2.set(3, 4)
arr2.set(4, 5)
println(arr2[1])
}
2、获取数组元素
获取数组元素的方式有三种:
- arr[index] ——角标方式
- arr.get(index) ——get方法
- for (a in arr){ } ——for 循环方式
示例代码:
代码语言:javascript复制fun main(args: Array<String>) {
var arr1 = arrayOf(1, 2, 3, 4, 5) //创建一个指定元素的数组
println(arr1.get(1)) //使用 get() 方法获取元素
println(arr1[1]) //使用 索引角标 获取元素 for (a in arr1) { //使用 for 循环遍历获取元素
println(a)
}
}
运行结果:
3、ByteArray 、ShortArray 、IntArray
ByteArray 、ShortArray 、IntArray 和 Array 并没有继承关系,但是它们有同样的方法属性集。使用这三个数组类,避免了数据的装箱操作。
代码语言:javascript复制fun main(args: Array<String>) {
var arr1 = intArrayOf(1, 2, 3, 4, 5) //创建一个指定元素的数组
println(arr1.get(1)) //使用 get() 方法获取元素
println(arr1[1]) //使用 索引角标 获取元素 for (a in arr1) { //使用 for 循环遍历获取元素
println(a)
}
}
本文到此结束,谢谢观看!