一、整数类型
类型 | 大小(位数) | 最小值 | 最大值 |
---|---|---|---|
Byte | 8 | -128 | 127 |
Short | 16 | -32768 | 32767 |
Int | 32 | -2,147,483,648 (-2^31) | 2,147,483,647 (2^31 - 1) |
Long | 64 | -9,223,372,036,854,775,808 (-2^63) | 9,223,372,036,854,775,807 (2^63 - 1) |
无需显示指定类型,会进行自动推导类型,默认是Int类型,如果超过了会推导为Long类型,如果需要的话也可以直接指定类型,如下
1
2
3
4
val one = 1 // Int
val threeBillion = 3000000000 // Long
val oneLong = 1L // Long
val oneByte: Byte = 1
二、浮点类型
类型 | 大小 | 有效位 | 指数位 | 小数位 |
---|---|---|---|---|
Float | 32 | 24 | 8 | 6-7 |
Double | 64 | 53 | 11 | 15-16 |
不指定类型时,只要携带 .
就会被推导为Double类型,也可以直接指定类型
1
2
3
4
val pi = 3.14 // Double
// val one: Double = 1 // Error: type mismatch
val oneDouble = 1.0 // Double
val eFloat = 2.7182818284f // Float, actual value is 2.7182817
需要注意如果显式的指定了Float类型后小数部分如果超过了6-7位后会进行四舍五入
Kotlin 中不会对数字直接进行隐式转换(attn. 函数运算中会进制显示转换),像下面这样会报错
1
2
3
4
5
6
7
8
9
10
11
fun main() {
fun printDouble(d: Double) { print(d) }
val i = 1
val d = 1.0
val f = 1.0f
printDouble(d)
// printDouble(i) // Error: Type mismatch
// printDouble(f) // Error: Type mismatch
}
通常可以我们可以进行显式转换,所有的数字都提供了不同类型转换方式
1
2
3
4
5
6
7
8
9
10
11
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
在函数运算中仍然可以帮我们隐式转换
1
val l = 1L + 3 // Long + Int => Long
三、数字常量的表示
十进制:123
十六进制:0x0F
二进制:0b00001011
八进制:Kotlin中不支持八进制
Kotlin中还可以给数字添加下划线来让数字更容易理解
1
2
3
4
5
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
四、位运算
Kotlin中提供了以下中缀形式函数来支持位运算,只支持Int
,Long
类型
shl(bits)
– 有符号左移shr(bits)
– 有符号右移ushr(bits)
– 无符号右移and(bits)
– 按位与or(bits)
– 按位或xor(bits)
– 按位异或inv()
– 按位取反
1
val x = (1 shl 2) and 0x000FF000
五、无符号整数
Kotlin中提供了以下无符号整数类型
UByte
:无符号8位整数,范围从0到255UShort
:无符号16位整数,范围从0到65535UInt
:无符号 32 位整数,范围从 0 到 2^32 - 1ULong
:无符号64位整数,范围从0到2^64 - 1
通过一下方式进行定义,使用用u
标签,无符号Long 可以使用 UL
1
2
3
4
5
6
7
val b: UByte = 1u // UByte, expected type provided
val s: UShort = 1u // UShort, expected type provided
val l: ULong = 1u // ULong, expected type provided
val a1 = 42u // UInt: no expected type provided, constant fits in UInt
val a2 = 0xFFFF_FFFF_FFFFu // ULong: no expected type provided, constant doesn't fit in UInt
val a = 1UL // ULong, even though no expected type provided and constant fits into UInt
主要用于一些无需负数含义的地方.例如通常的颜色表示 如32位argb值
1
2
3
data class Color(val representation: UInt)
val yellow = Color(0xFFCC00CCu)
六、Boolean类型
Boolean类型的内置运算包含
||
– 逻辑或&&
– 逻辑与!
– 逻辑非
1
2
3
4
5
6
7
val myTrue: Boolean = true
val myFalse: Boolean = false
val boolNull: Boolean? = null
println(myTrue || myFalse)
println(myTrue && myFalse)
println(!myTrue)
七、Char类型
通常使用单引号括起来 ‘1’,特殊字符需要使用\
进行转意
\t
- 标签\b
– 退格键\n
– 换行(LF)\r
– 回车符 (CR)\'
– 单引号\"
– 双引号\\
– 反斜杠\$
- 美元符号
编码其他字符的需要使用Unicode进行转意
1
2
3
4
5
val aChar: Char = 'a'
println(aChar)
println('\n') // Prints an extra newline character
println('\uFF00')
八、String类型
通常使用双引号括起来,字符串支持索引访问,支持遍历
1
2
3
4
5
val str = "abcd 123"
//val str1 =str[1]
for (c in str) {
println(c)
}
字符串一旦创建时不可变的,所有的转换操作都是返回一个新的字符串
字符串可以使用 +
操作符进行字符串拼接,但需要注意拼接时的第一个字符串必须是String类型
字符串主要包括以下几种类型
- 转意字符串:可包含转意字符 或任意字符
1
val s = "Hello, world!\n"
- 多行字符串:可包含换行和任意文本,不包含转意
1
2
3
4
val text = """
for (c in "foo")
print(c)
"""
- 字符串模版:可以使用
$
or${}
将常量,表达式结果等拼接到字符串中
1
2
3
4
5
6
7
8
9
10
11
val i = 10
println("i = $i") // 输出“i = 10”
val s = "abc"
println("$s.length is ${s.length}") // 输出 "abc.length is 3"
//多行字符串中使用模版可以用$进行转意
val price = """
${'$'}_9.99
"""
九、数组
Kotlin中数组由Array
类表示,通常最好在遇到性能问题或需要自定义数据结构时使用数组,否则集合应该是一个更好的选择.
原始类型数组 | Java 中的等效项 |
---|---|
BooleanArray | boolean[] |
ByteArray | byte[] |
CharArray | char[] |
DoubleArray | double[] |
FloatArray | float[] |
IntArray | int[] |
LongArray | long[] |
ShortArray | short[] |
创建数组
通常可以使用arrayOf()
、arrayOfNulls()
或emptyArray()
来创建数组
也可以通过指定大小,传递一个函数进行初始化
1
2
3
4
5
6
7
8
9
// Creates an Array<Int> that initializes with zeros [0, 0, 0]
val initArray = Array<Int>(3) { 0 }
println(initArray.joinToString())
// 0, 0, 0
// Creates an Array<String> with values ["0", "1", "4", "9", "16"]
val asc = Array(5) { i -> (i * i).toString() }
asc.forEach { print(it) }
// 014916
创建多维数组
1
2
3
4
5
6
7
8
9
//创建二维数组
val twoDArray = Array(2) { Array<Int>(2) { 0 } }
println(twoDArray.contentDeepToString())
// [[0, 0], [0, 0]]
// 创建三维数组
val threeDArray = Array(3) { Array(3) { Array<Int>(3) { 0 } } }
println(threeDArray.contentDeepToString())
// [[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
传递可变数量参数给函数
使用扩展运算符*
进行传递
1
2
3
4
5
6
7
8
9
10
11
fun main() {
val lettersArray = arrayOf("c", "d")
printAllStrings("a", "b", *lettersArray)
// abcd
}
fun printAllStrings(vararg strings: String) {
for (string in strings) {
print(string)
}
}
比较数组
数组在比较时不可以直接使用==
or !=
,需要使用数组的比较函数.contentEquals()
和.contentDeepEquals()
数组变换
同集合一样提供了一系列变换方法,如:sum
shuffle
map
fliter
等