- 开发环境:IntelliJ IEDA
- 个人博客:http://blog.csdn.net/IInmy
- 项目源码:https://github.com/Rushro2m/KotlinForOfficial
- 官方文档中文版:https://www.kotlincn.net/docs/reference/basic-types.html
1、数字
Kotlin处理数字在某种程度上接近Java,但是并不完全相同。例如,对于数字没有隐式拓宽转换(如Java中int可以隐式转换为long),另外有些情况字面值略有不同。
Kotlin提供了一些内置类型来表示数字:
Type | Bit width |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
(1)字面常量
数字常量字面值有以下几种:
- 十进制:123
- 十六进制:0x0F
- 二进制:0b00001011
- 不支持八进制
//十进制
val a = 123
val b = 123L
//十六进制
val c = 0x0f
//二进制
val d = 0b00001011
Kotlin同样支持浮点数的常规表示方法
- 默认类型为Double:123.5、123.5e10
- Float用f或者F标记:123.5f
//默认double
val e = 123.5
val f = 123.5e10
//Float用f或者F
val g = 123.5F
val i = 123.5f
(2)下划线的使用
可以使用下划线使数字常量更易读
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)表示方式
在Java平台数字是物理存储为JVM的原生类型,除非我们需要一个可空的引用(如Int?)或泛型。后者情况下会把数字装箱。
数字装箱不必保留一致性, 但它保留了相等性:
val a: Int = 10000
print(a === a) // 输出“true”
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA == anotherBoxedA) // 输出“true”
print(boxedA === anotherBoxedA) // !!!输出“false”!!!
注:在Kotlin中,“==”表示比较值是否相等,而“===”比较两个对象的地址是否相同
(4)显隐转换
Kotlin中较小的类型不能隐式转换为较大的类型,通过显式转换拓宽数字
- toByte():Byte
- toShort():Short
- toInt():Int
- toLong():Long
- toFloat():Float
- toDouble():Double
- toChar():Char
//错误的写法,编译不通过
val b: Byte = 1
val i: Int = b
//正确写法, 必须显式转换
val b: Byte = 1
val i: Int = b.toInt()
缺乏隐式类型转换并不显著,因为类型会从上下文推断出来,而算术运算会有重载做适当转换。
val l = 1L + 3//Long + Int => Long
(5)运算
Kotlin支持数字运算的标准集,运算被定义为相应的类成员(但编译器会将函数调用优化为相应的指令)
对于位运算,没有特殊字符来表示,而只可用中缀方式调用命名函数,例如:
val x = (1 shl 2) and 0x000FF000
完整的位运算列表(只用于Int和Long)
- shl(bits) - 有符号左移(Java 的<<)
- shr(bits) - 有符号右移(Java的>>)
- ushr(bits) - 无符号右移(Java的>>>)
- and(bits) - 位与
- or(bits) - 位或
- xor(bits) - 位异或
- inv(bits) -位非
注:>>、<<、>>>是将二进制数进行位移。
//两种调用方式,结果都为0
println(1 shr 2)
println(1.shr(2))
//结果为1
println(2 shl 1 shr 2)
println(2.shl(1).shr(2))
2、字符
字符用Char类型表示。一对单引号包括的值,为字符字面值。它们不能直接当作数字,比如这样:
fun check(c: Char) {
if (c == 1) {//错误:类型不兼容
//...
}
}
字符字面值用单引号括起来:‘1’。特殊字符可以用反斜杠转义。支持这几个转义序列:\t、\b、\n、\r、\’、\”、\和$。编码其它字符要用Unicode转义序列语法:’\uFF00’。
我们可以显式把字符转换为 Int 数字:
fun decimalDigitValue(c: Char): Int {
if (c !in '0'..'9') {
println("不在范围内")
}
return c.toInt() - '0'.toInt()//显式转换为数字
}
常用的方法
- isDigit()–>判断是否为数字
- isLetter()–>判断是否为字母
val aNum = '3'
val aLetter = 'a'
if (aNum.isDigit()) {
println("aNum是一个数字")
}
if (aLetter.isLetter()) {
println("aLetter是一个字母")
}
3、布尔
布尔用Boolean类型表示,它有两个值:true和false。若需要可空引用布尔会被装箱。
var isVip = true
if (isVip) {
println("欢迎Vip会员")
} else {
println("还不赶紧充值")
}
内置的布尔运算有:
- || 短路逻辑或
- && 短路逻辑与
- ! 逻辑非
fun main(args: Array<String>) {
val x = true
val y = false
println(x || y)
println(x && y)
println(!x)
}
4、数组
数组在Kotlin中使用Array类来表示,它定义了get和set函数(按照运算符重载约定这会转变为[])和size属性,以及一些其它有用的成员函数:
(1)Array类中的一些属性和方法:
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>
// ……
}
(2)创建数组
- arrayOf()
可以使用库函数arrayOf()来创建一个数组并传递元素之给它.
val ao = arrayOf(1, 2, 3, 4)
- arrayOfNulls()
可以用于创建一个指定大小,所有元素为空的数组。
val aon = arrayOfNulls<String>(3)
- Array
接受数组大小和一个函数参数的Array构造函数,用作参数的函数能够返回给定索引的每个元素的初始值:
val a = Array(5, { i -> (i * i).toString() })
注:Kotlin中数组是不型变的(invariant)。这意味着Kotlin不让我们把Array赋值给Array,以防止可能的运行是失败。
5、字符串
字符串用String类型表示,是有序字符(Char)集合。字符串是不可变的,字符串的元素–字符可以使用索引运算符访问s[i]。可以用for循环迭代字符串:
for(c in str){
println(c)
}
(1)字面值
Kotlin中有两种类型的字符串字面值:转义字符串可以有转义字符,以及原生字符串,可以包含换行和任意文本。
- 转义字符串
转义采用传统的反斜杠方式。
val s = "Hello world!\n"
- 原生字符串
原生字符串 使用三个引号分界符括起来,内部没有转义并且可以包含换行和任何其它字符:
val text = """
for(c in "foo")
println(c)
"""
可以通过trimMargin()函数取出前导空格
val text2 = """
|Tell me and I forget.
|Teach me and I remember.
|Involve me and I Learn.
|(Benjamin Franklin)
""".trimMargin()
默认 | 用作边界前缀,但你可以选择其它字符并作为参数传入,比如 trimMargin(“>”)
val text2 = """
>Tell me and I forget
>Teach me and I remember
>Involve me and I Learn
>(Benjamin Franklin)
""".trimMargin(">")
print(text2)
(2)字符串模版
字符串可以包含模版表达式,即一些小代码块,会求值并把结果合并到字符串中。模版表达式以美元符($)开头,由一个简单的名字构成:
val i = 10
val s = "i = $i"
或者用花括号括起来的任意表达式:
val s = "abc"
//输出内容为:"abc.length is 3"
val str = "$s.length is ${s.length}"
原生字符串和转义字符串内部都支持模版。如果需要在原生字符串中表示字面值$字符(它不支持反斜杠转义),你可以用下列语法:
val price = """
${'$'}9.99
"""
//输出结果为:$9.99
println(price)
(3)常用方法
- 判断字符串是否为空:isEmpty()
- 是否不为空:isNotEmpty()
- 计数:count()或者size
- 转换为字符数组:toCharArray()
//判断字符串是否为空
course.isEmpty()
//判断字符串是否不为空
course.isNotEmpty()
//计数
course.count()
//将字符串转换为字符数组
for (letter in course.toCharArray()) {
println(letter)
}