Kotlin
变量与基本类型
var
var [变量名称] : 数据类型
变量命名规范同Java
val
val
关键字用于定义常量,常量的值只能赋值一次,之后就不能更改
fun main() {
var a = 10
a = 20
println(a + 2)
val b = 20
println(b)
}
数字类型
类型 | 大小(bit) | 范围 |
---|---|---|
Byte | 8 | -2^7~2^7-1 |
Short | 16 | -2^15~2^15-1 |
Int | 32 | -2^31~2^31-1 |
Long | 64 | -2^63~2^63-1 |
类型 | 大小 | 符号与尾数位数 | 阶码尾数 | 小数位数 |
---|---|---|---|---|
Float | 32 | 24 | 8 | 6-7 |
Double | 64 | 53 | 11 | 15-16 |
fun main() {
val a: Byte = 127
val b: Short = -32768
val c: Int = 1_000_000_000
val d = 10_000_000_000 // 超过Int最大值,推断为Long
val f = 111L // 添加大写字母L来表示这是一个Long类型的数值, 否则推断为Int
}
数字类型不仅可以写成十进制,也可以以十六进制或是二进制表示(Kotlin不支持八进制表示)只需要添加对应的前缀即可,比如一个十六进制数据:
val a = 0xAF
二进制
val a = 0b1001 //0b前缀表示二进制数据,后面的1010对应着十进制的9
但Kotlin不支持八进制表示
// 默认推断为Double类型
val a = 3.14
val b: Double = 1.23
// 错误的,1不是小数,无法编译通过
val c: Double = 1
val d: Float = 2.7182818284f // 这里表示为Float会导致精度折损,得到2.7182817
定义浮点数时,默认推断是Double
类型,如果需要定义Float
类型,需要显示添加f
或者F
后缀。
Kotlin中的数字类型没有隐式转换的操作,例如,一个Double
类型的变量无法将其值赋值给Int
类型变量:
fun main() {
val a: Double = 114.15
val b: Int = a
}
无符号类型
除了整数类型外,Kotlin还为无符号整数提供以下类型:
UByte
:一个无符号8位整数,范围从0到255UShort
:无符号16位整数,范围从0到65535UInt
:一个无符号32位整数,范围从0到2^32 - 1ULong
:一个无符号64位整数,范围从0到2^64 - 1
使用u
或者U
后缀表示无符号整数,如果变量没有提供类型,编译器将根据数字的大小使用UInt
或ULong
:
fun test2() {
val b: UByte = 1u // UByte类型, 由变量提供的类型
val s: UShort = 1u // UShort类型, 由变量提供的类型
val l: ULong = 1u // ULong类型, 由变量提供的类型
val a1 = 42u // UInt类型,根据数字大小自动推断得到
val a2 = 0xFFFF_FFFF_FFFFu // ULong类型,根据数字大小自动推断得到
}
uL
或者UL
可以直接将整数标记为无符号Long类型
val a = 11UL
数值运算
除法运算
fun test1() {
var a = 2 // Int
var b = 5 // Int
var c = b / a // Int
println(c) // 2
}
当两个整型相除时,结果还是整型,也就是会舍去小数部分
要得到小数,需要除数被除数至少有一个是浮点型
fun test2() {
var a = 2.0
var b = 5
var c = b / a
println(c)
}
与,或,异或,取反
与,或,异或,取反只适用于Int和Long整数类型
Kotlin 中的位运算符并未采用特殊的符号形式,而是提供and,or,xor
等进行位运算
var a = 7 and 2 // 0111 & 0010 = 0010
var b = 7 or 2 // 0111 | 0010 = 0111
var c = 7 xor 2 // 0111 ^ 0010 = 0101
var d = 7.inv() // ~0111 = 1000
左移,右移
shl(bits)
– 有符号左移,低位补0,符号位不变shr(bits)
– 有符号右移,符号位不变ushr(bits)
– 无符号右移,高位补0
val a = 4 shl 1 // 0100 << 1 = 1000
var b = 5 shr 1 // 0101 >> 1 = 0010
var c = -1 ushr 1
println(a)
println(b)
println(c)
不同运算符优先级:从上往下优先级依次减弱
- 一元运算符:例如 ++、--、+、-、!、~
- 乘法和除法运算符:*、/、%
- 加法和减法运算符:+、-
- 位移运算符:shl、shr、ushr
- 按位与运算符:and
- 按位或运算符:or
- 按位异或运算符:xor
- 逻辑运算符:&&、||
- 比较运算符:>、>=、<、<=、==、!=
- 区间运算符:..
- 赋值运算符:=、+=、-=、*=、/=、%=
布尔类型
布尔类型只包含true
和false
,表示状态
val a = true
布尔类型除了通过直接赋值,也可以通过一些关系运算得到:
a == b
a != b
a < b
a > b
a >= b
a <= b
x in a..b
x !in a..b
kotlin中可以使用a..b
来快速表示[a, b]
这样的闭区间
val f: IntRange = 2..10
布尔类型的值之间也可以使用一些逻辑运算符进行组合判断:
- ||:逻辑或
- &&:逻辑与
- !:取反
val a = 10
val b = 20
val c = a > b
println(c)
println(100 > a && b >= 60)
println(a > 100 || b > 10)
println(!c)
字符类型
字符类型可以表示计算机中任意一个字符,如中文,英文,标点。Char
类型占用两个字节空间,使用Unicode标准字符集
val a = 'A'
val b = '\u0041'
println(a) // A
println(b) // A
字符A对应Unicode编码为65,这里需要使用十六进制表示,65对应16进制为0x41
字符串
单行字符串
使用""
包裹的字符序列,使用String
表示
val a: String = "Hello world"
val b: String = "\uD83D\uDE0E" // 也可用Unicode编码表示
多行字符串
使用"""
包裹的字符序列:
val text = """
这是第一行
这第二行
别\n了,没用
真牛逼啊,这功能隔壁Java15才有
haha\u000A这里也没用
haha${'\u000A'}这里有用
"""
println(text)
多行字符串中无法使用转义字符
字符串拼接
字符串之间可以拼接使用,当字符串和其他类型拼接使用时,需要注意拼接的顺序,只能由字符串在前
val c = "hello" + "world";
val d = "hello " + 111
// val d = 111 + " hello"
字符串模版
val a = 10
val text = "这是拼接的值$a" //这里的$为模版表达式,可以直接将后面跟着的变量或表达式以字符串形式替换到这个位置
println(text)
如果添加在前面需要在变量后添加空格,否则认为$
后面全是变量名
val text = "$a 这是拼接的值"
或者使用${}
包裹变量或者表达式
var text = "变量a: ${a}"
var t = "表达式: ${100 + 20}"