Kotlin学习日记-基础类型

1.基本类型

1.1 数字

1.1.1 整数

Kotlin 提供了一组表示数字的内置类型。对于整数,有四种不同大小的类型,因此值的范围也不同。

类型 位数 最小值 最大值
Byte 8 -128(-2^7) 127(2^7-1)
Short 16 -32768(-2^15) 32767(2^15-1)
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 最大值的整形值都会推断为 Int 类型,如果超出了,则会推断为Long类型。

val one = 1 //推断为Int
val threeBillion = 3000000000 //推断为Long

如果需要显式指定Long类型,需要在该值后面加 L 后缀或者声明类型

val long = 1L
val long:Long = 1
1.1.2 浮点

对于浮点数,Kotlin提供了Float与Double类型

Col1 Col2 Col3 Col4 Col5
Float 32 24 8 6-7
Double 64 53 11 15-16
  1. 对于小数出初始化的变量,编译器会推断为=Double=类型
  2. 如需将一个显式指定为=Float=,请该值后面追加L后缀或声明类型
val pi = 3.14 //Double
val e = 2.7182818284 //Double
val eFloat = 2.7182818248f //Float 实际值为 2.7182817
val eFloatType:Float = 2.7182818248
1.1.3 字面常量

数值常量字面值有以下几种:

  • 十进制:=123=
    • Long类型用大写=L=标记:=123L=
  • 十六进制:=0X0F=
  • 二进制:00110011

注意:不支持八进制
tips:
数字字面值中可以用下划线作为分隔符使数字更易读

val oneMillion = 1_000_000
val longNumber = 1234_5678_1234L
val hexBytes = 0XFF_EC_DE_5E
val bytes = 11000000_11110000_11110000_22220000
1.1.4 位运算

对于位运算,没有特殊字符来表示,只可用中缀方式调用具名函数,例如

val x = (1 shl 2) and 0x000FF000

这是完整的位运算列表(只用于Int与Long)

  • shl -有符号左移
  • shr -有符号右移
  • ushr -无符号右移
  • and -位与
  • or -位或
  • xor -位异或
  • inv -位非

数字比较
– 相等性检测:a == b 与 a != b
– 比较操作符:a < b, c > d,a <= b,c >= d
– 区间实例以及区间检测:a…b,x in a…b,x !in a…b

1.1.5 无符号整形

Kotlin 为无符号整数引入了以下类型:

kotlin.UByte: 无符号 8 比特整数,范围是 0 到 255
kotlin.UShort: 无符号 16 比特整数,范围是 0 到 65535
kotlin.UInt: 无符号 32 比特整数,范围是 0 到 2^32 - 1
kotlin.ULong: 无符号 64 比特整数,范围是 0 到 2^64 - 1
无符号类型支持其对应有符号类型的大多数操作。

1.2 布尔

布尔用Boolean类型表示,它有两个值:true与flase
若需要可控引用布尔会被装箱
内置的布尔运算有:

  1. || -短路逻辑或
  2. && -短路逻辑与
  3. ! -逻辑非

1.3 字符

字符用Char类表示,他们不能直接当做数字

fun check(c:Char){
    if(c == 1){ //错误:类型不兼容
        // ....
    }
}
  1. 字符字面值用单引号括起来:‘1’
  2. 特殊字符可以用反斜杠转义,支持以下几个转义序列:\t、\b、\n、\r、'、"、\与$

当需要可用引用时,像数字、字符会被装箱,装箱操作不会保留同一性

1.4 字符串

  1. 字符串用String类型表示。
  2. 字符串是不可变的,字符
  3. 字符串的元素,可以使用索引运算符访问字符:s[i]
  1. 可以用for循环遍历字符串
for (c in str){
    println(c)
}

2.可以用+操作符连接字符串

val  s = "abc" + 1
println(s + "def")

3.如果有大量文本需要保留原来格式,可用"""括起来

val text="""
    for (c in "foo")
        print(c)
"""
1.4.1 字符串模板

字符串字面值可以包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。 模板表达式以美元符($)开头,由一个简单的名字构成:

val s = "abc"
println("$s.length is ${s.length}") // 输出“abc.length is 3”

1.5 数组

数组在 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>
    // ……
    
}

// 创建一个 Array 初始化为 ["0", "1", "4", "9", "16"]
val asc = Array(5) { i -> (i * i).toString() }
asc.forEach { println(it) }

2.类型检测与类型转换

2.1 is 与 !is 操作符

使用 is 操作符或其否定形式 !is 在运行时检测对象是否符合给定类型:

if (obj is String) {
    print(obj.length)
}

if (obj !is String) { // 与 !(obj is String) 相同
    print("Not a String")
} else {
    print(obj.length)
}

2.2 智能转换

大多数场景都不需要在 Kotlin 中使用显式转换操作符,因为编译器跟踪不可变值的 is-检测以及显式转换,并在必要时自动插入(安全的)转换:

fun demo(x: Any) {
    if (x is String) {
        print(x.length) // x 自动转换为字符串
    }
}
//编译器足够聪明,能够知道如果反向检测导致返回那么该转换是安全的:
if (x !is String) return

print(x.length) // x 自动转换为字符串

智能转换用于 when 表达式 和 while 循环 也一样:

when (x) {
    is Int -> print(x + 1)
    is String -> print(x.length + 1)
    is IntArray -> print(x.sum())
}

2.3 转换操作符

2.3.1 "不安全的"转换操作符

通常,如果转换是不可能的,转换操作符会抛出一个异常。因此,称为不安全的。 Kotlin 中的不安全转换使用中缀操作符 as。

val x: String = y as String
2.3.2 "安全的"转换操作符

为了避免异常,可以使用安全转换操作符 as?,它可以在失败时返回 null:

val x: String? = y as? String

请注意,尽管事实上 as? 的右边是一个非空类型的 String,但是其转换的结果是可空的。

2.4 类型擦除与泛型检测

2.5 非受检类型转换

你可能感兴趣的:(Kotlin-学习日记,kotlin,学习,android)