文章目录
1. 基本数据列表
| 类型 | 字节数 |
|---|---|
| Byte | 1 |
| Short | 2 |
| Int | 4 |
| Long | 8 |
| UByte, UShort, UInt, ULong | 无符号整形 |
| Float | 4 |
| Double | 8 |
| Boolean | 通常1字节 |
| Char | 2 |
| String | |
| Array | 数组 |
| IntArray, ByteArray 等 | 无装箱开销的专用数组类,性能更好 |
2. 声明及赋值
2.1变量定义
变量定义用var或val
var i: Int = 1
// val定义的变量不能改变
val j: Int = 1
// j = 2 // 错误
2.2 常量
// 编译期常量 const val
const val PI: Double = 3.14
2.3 类型推断
Kotlin 拥有强大的类型推断能力,所以不需要显式声明变量的类型
var i = 1 // 编译器推断为 Int
// 为什么是Int, 而不是Byte, 往下看
2.4 字面量 (Literal constants)
2.4.1 数字字面量
整形的字面量, 默认是Int, 浮点数字面量默认是Double
val a = 1 // Int, 整形默认Int
val b = 1L // Long, 加L 就是Long
val threeBillion = 3000000000 // Long, 超出了Int的范围
val c: Byte = 1 // Byte
val i1 = 0xFF // Int, 十六进制 0x/0X开头
val i2 = 0b00001011 // Int, 二进制 0b开头
val u1 = 1U // UInt
val u1 = 1UL // ULong
val f1 = 1.0 // Double, 浮点型默认Double
val f2 = 3.14F // Float, 加F/f就是Float
2.4.2 Boolean字面量
// 只有ture和false
val b = true
2.4.2 Char字面量
val c1 = 'a'
val c2 = '\n'
val c3 = '\uFF00' // Unicode
2.4.3 String字面量
// 常规
val str = "abc 123"
// 字符串模板: $变量名, ${表达式}
val a = 1
val score = 100
val s = "hello, your order is $a, your score is ${score * 100}"
println(s)
// hello, your order is 1, your score is 10000
// 字符串也可以用+连接
val s1 = "hello, your order is " + a + ", your score is " + (score * 100)
2.4.4 多行模式字符串
三个引号之间是多行文本,可以包括\n, "等, 不会被转义,而且空行和空格也会原样保留。 字符串模板($x)生效
trimIndent()可以去除第一行和最后一行的空行, 去除每行前的空格, 但是空格数都是最左边的行的空格数
trimMargin()可以去除第一行和最后一行的空行, 去除每行前的|前的空格,|是默认的分隔符,也可以自己指定。
fun main() {
println("-----------------")
val text1 = """
hello \n
world ' "
1111
222
"""
println(text1)
println("-----------------")
val text2 = """
hello \n
world ' "
1111
222
""".trimIndent()
println(text2)
println("-----------------")
val text3 = """
|hello \n
|world ' "
|1111
|222
""".trimMargin()
println(text3)
println("-----------------")
}
// 输出:
-----------------
hello \n
world ' "
1111
222
-----------------
hello \n
world ' "
1111
222
-----------------
hello \n
world ' "
1111
222
-----------------
2.4.5 原样输出$
// 可以用\$ 或 ${'$'}, 多行模式因为\不会转义,所以只能用${'$'}
val a = 1
val s = """
hello ${'$'}b
""".trimIndent()
println(s)
// hello $b
2.4.6 字符串格式化
// 类似java
val s = String.format("Your name is %s, your score is %.2f", "James Chang", 56.3456)
println(s)
// Your name is James Chang, your score is 56.35
3. 数组
数组表示一组相同类型的元素
// 类型推断为 Array<Int>, 元素实际上包装类型
val arr = arrayOf(1, 2, 3) //
// 相当于java中 int[]
val intArr = intArrayOf(1, 2, 3) // 类型是IntArray
println(intArr[0]) // 获取元素
intArr[0] = 100 // 修改元素
val arr = Array(5) {1} // 5个元素, 每个元素都是1
4. 类型转换
不同数据类型不能直接转换, 必须用方法
val a: Int = 1
val b: Long = a // 错误
// 必须用相应的方法
val b1: Long = a.toLong()
3.5.roundToInt() // 4
// 运算会自动转换
val c: Long = 1L + 3 // Long + Int => Long
5. 可空类型 (nullable)
这些类型都有对应的可为null类型,也就是说Int不能为null, 后面加?就变成了可空类型Int?
Int, Float这些不可空类型在在JVM中相当于java的int, float等, 而Int?, Float?相当于java的Integer, Float等
// var a: Int = null // 错误
var a = 1 // a的类型是Int
var b: Int? = null // ok
// as 强转
a = b as Int // runtime error, 如果b有值就正确
b = a // ok 相当于自动装箱

被折叠的 条评论
为什么被折叠?



