Kotlin

变量与基本类型

var

var [变量名称] : 数据类型

变量命名规范同Java

val

val关键字用于定义常量,常量的值只能赋值一次,之后就不能更改

fun main() {
    var a = 10
    a = 20
    println(a + 2)
    val b = 20
    println(b)
}

数字类型

类型大小(bit)范围
Byte8-2^7~2^7-1
Short16-2^15~2^15-1
Int32-2^31~2^31-1
Long64-2^63~2^63-1
类型大小符号与尾数位数阶码尾数小数位数
Float322486-7
Double64531115-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
}

image-20240301005218258

无符号类型

除了整数类型外,Kotlin还为无符号整数提供以下类型:

  • UByte:一个无符号8位整数,范围从0到255
  • UShort:无符号16位整数,范围从0到65535
  • UInt:一个无符号32位整数,范围从0到2^32 - 1
  • ULong:一个无符号64位整数,范围从0到2^64 - 1

使用u或者U后缀表示无符号整数,如果变量没有提供类型,编译器将根据数字的大小使用UIntULong

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)

不同运算符优先级:从上往下优先级依次减弱

  1. 一元运算符:例如 ++、--、+、-、!、~
  2. 乘法和除法运算符:*、/、%
  3. 加法和减法运算符:+、-
  4. 位移运算符:shl、shr、ushr
  5. 按位与运算符:and
  6. 按位或运算符:or
  7. 按位异或运算符:xor
  8. 逻辑运算符:&&、||
  9. 比较运算符:>、>=、<、<=、==、!=
  10. 区间运算符:..
  11. 赋值运算符:=、+=、-=、*=、/=、%=

布尔类型

布尔类型只包含truefalse,表示状态

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}"