Kotlin学习笔记-02

65 阅读3分钟

2、基本类型

2.1 数字

  • 当初始化一个没有显式指定类型的变量时,编译器会自动推断为足以表示该值的最小类型。

  • 数字字面量:

    • 十进制: 123

      • Long 类型用大写 L 标记: 123L
    • 十六进制(以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()成员函数互相转换。

  • 位运算,只能用于IntLong

    • shl(bits) – 有符号左移
    • shr(bits) – 有符号右移
    • ushr(bits) – 无符号右移
    • and(bits) – 位
    • or(bits) – 位
    • xor(bits) – 位异或
    • inv() – 位非
  • 数字比较,与Java不同的是,有区间检测的语法

    区间实例以及区间检测:a..bx in a..bx !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
    }