2、基本类型
2.1 数字
-
当初始化一个没有显式指定类型的变量时,编译器会自动推断为足以表示该值的最小类型。
-
数字字面量:
-
十进制:
123- Long 类型用大写
L标记:123L
- Long 类型用大写
-
十六进制(以
0x为前缀):0x0F -
二进制(以
0b为前缀):0b00001011 -
你可以使用下划线使数字常量更易读(下划线放在哪里都可以,但不能作为数字的第一个或最后一个字符):
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 val wrongNum1 = 0x_FFFF; // wrong val wrongNum1 = 0xFFFF_; // wrong
-
-
所有数字类型之间可以通过调用
toXxx()成员函数互相转换。 -
位运算,只能用于
Int和Longshl(bits)– 有符号左移shr(bits)– 有符号右移ushr(bits)– 无符号右移and(bits)– 位与or(bits)– 位或xor(bits)– 位异或inv()– 位非
-
数字比较,与Java不同的是,有区间检测的语法
区间实例以及区间检测:
a..b、x in a..b、x !in a..b
2.2 字符
- 如果字符变量的值是数字,那么可以使用
digitToInt()函数将其显式转换为Int数字。
2.3 字符串
-
字符串的元素——字符可以使用索引运算符访问:
s[i]。 可以使用for循环遍历这些字符: -
字符串模板 & 原始字符串 & 字符串连接
-
字符串连接:
var a = "abc" + d,不推荐使用,优先使用其他两种 -
原始字符串:
-
原始字符串可以包含换行以及任意文本。 它使用三个引号(
""")分界符括起来,内部没有转义并且可以包含换行以及任何其他字符。 -
如需删掉原始字符串中的前导空格,请使用
trimMargin()函数。 -
默认以竖线
|作为边界前缀,但你可以选择其他字符并作为参数传入,比如trimMargin(">")。
-
-
字符串字面值可以包含模板表达式——一些小段代码,会求值并把结果合并到字符串中。
模板表达式以美元符(
$)开头,要么由一个的名称构成,要么是用花括号括起来的表达式。在原始字符串及转义字符串中都可以使用模板。
var v1 = 233 var v2 = "guess who is it" var str1 = "v1.value is $v1" var str2 = "$v2.length is ${v2.length}"
2.4 数组
数组在Kotlin中用Array类来表示,并且其get()和set()方法都被[]运算符重载了。
-
创建数组
fun main() { val nums1 = arrayOf<Int>(1, 2, 3) // 类型声明是可选的arrayOf(),这使数组变得灵活。 // 如果未定义数组类型,那么您可以在数组中存储任何类型的元素。 val numsObj = arrayOf("123", 2, 4.0f, 4.55) val nums2 = arrayOfNulls<Int>(3) val nums3 = Array(5) { i -> (i * i).toString() } // 建议把初始化lambda表达式写在外面 val nums4 = Array(5, { i -> (i * i).toString() }) // 原生类型数组 val intArray1: IntArray = intArrayOf(1, 2, 3) val intArray2: IntArray = IntArray(5) val intArray3: IntArray = IntArray(5) { 123 } val intArray4: IntArray = IntArray(5) { it * 2 } // 多维数组 // 目前只能通过嵌套的方式来创建多维数组 val array = arrayOf( arrayOf(1, 2, 3), arrayOf(4, 5, 6), arrayOf(7, 8, 9) ) }
2.5 类型检测 & 类型转换
-
类型判断:采用
is关键字fun detect(obj: Any) { // 类型判断使用 is 关键字 if (obj !is String) { println("not a string") } } -
智能类型转换
fun autoTransfer(obj: Any, obj2: Any) { // 正向转换&反向转换 if (obj is String) { println(obj.length) } if (obj !is String) { println("not a string") return } println(obj.length) when (obj2) { is String -> println("obj2 is a String") 1 -> println("obj2 == 1") else -> println("whatever") } // 类型判断用于 && 或 || 的左侧,也可完成智能转换 // 用于when中,也可完成智能转换 } -
类型转换
fun transfer(obj: Any) { // 基本写法,使用 as 关键字进行类型转换 val x: String = obj as String // 为了防止obj是空值导致的转换失败,使用 ? 表示为可空类型 val x2: String? = obj as String? // 安全的转换操作符 as? val x3: String? = obj as? String }