Kotlin学习笔记之 2 基本数据类型

Kotlin学习笔记之 2 基本数据类型_第1张图片

首发于公众号: DSGtalk1989

2.基本数据类型

  • 分割数字

    为了更直观,可以在数字上用_来进行截取(这个kotlin和java都OK,只是现在才发现而已)

    比如中国人比较喜欢 1_0000_0000 表示一个亿 外国人比较喜欢 1_000_000 1 million

    同样的 0xEF_10_CC 分割十六进制等

  • 基本数据类型还是封装数据类型

    大家都会有个误解,说kotlin只有Int没有Integer,是kotlin放弃了封装类型,只剩下了基本类型。

    此处千万不要误解,只不过是名字叫Int,但实际上他依然是封装类型,为了防止出现空的情况。 在Primitives.kt文件中

     /**
     * Represents a 32-bit signed integer.
     * On the JVM, non-nullable values of this type are represented as values of the primitive type `int`.
     */
    public class Int private constructor() : Number(), Comparable {
    

    我们看到,所描述的是表示一个32位的整型,在JVM中,对于非空的情况下等同于基本类型int

    既然是封装的,就会有对象相等和数字相等

    === 代表地址 ==代表值

  • kotlin中去掉了java中的位运算符

    shl ====== << 左移

    shr ====== >> 右移

    ushr ======= >>> 无符号右移

    and =====&` 与

    or ===== |

    xor ===== ^ 异或

    inv ===== ~

  • java中你可以写 char a = 1; 但是在kotlin中char必须要有'',否则会报错

    var c : Char = 1 会报错

  • 布尔运算符只是针对 Boolean, 如果用的是Boolean? 就会出现报错, 如下

     var b : Boolean?  = true
     var c : Boolean?  = true
    
     //报错
     var d = b && c
     //要么做判空断言抛异常
     var d = b!! && c!!
     //要么做判空额外处理
     var d = b?: true && c?: false
    
  • 数组构造方式

    kotlin的数组构造方式有两种,与java完全不同。

    • 第一种构造

      //arrayOf函数,自带分析属性,你如果传入了1,2,3那么kotlin就会默认将array认为是Int数组
      var array = arrayOf(1,2,3)
      

      我们经过打印之后能够看到,是整型数组 [Ljava.lang.Integer;@a390116

      同样的,另外一个方法arrayListOf(),效果一样的产生arrayList列表,但是arrayList列表通过println方法是可以直接将数据打印出来的

      var array1 = arrayListOf(1,2,3)
      println(array1)
      //打印出来
      System.out: [1, 2, 3]
      

      补充(1)一下我们肯定可以,并且经常直接拿来用的是intArrayOf, xxxArrayOf

      只不过直接使用的intArrayOf返回的是IntArray类型,而arrayOf(1,2,3)Array,两者不能相互赋值!

      补充(2)kotlin中无论是Array还是List,都可以使用[index]的方式来进行取值

      补充(3)kotlin可以直接通过array.indices来拿到index的迭代

      var list = listOf(1,2,3)
      
       for(i in list.indices){
           println(list[i])
           println(i)
       }
      

      补充(4)甚至可以直接使用array.withIndex()方法直接走key,value的形式

      for((index, value) in newArray.withIndex()){
           print("index is $index, value is $value")
      }
      

      补充(5)array和list以及set等数组列表类型都可以通过相关方法做链式调用

      fruits
         //筛选
         .filter { it.startsWith("a") }
         //排序
         .sortedBy { it }
         //统一处理
         .map { it.toUpperCase() }
         //遍历
         .forEach { println(it) }
      

      arrayOf的构造函数中有一个reified关键字,具体可见传送门,有点意思,后面再说

    • 第二种构造

      使用Array()构造函数。需要传两个参数,一个是size,一个是lambda表达式

      我们写了个例子:

      val e = Array(3, { i -> (i * 2) })
      
      for(i in e){
          println(i)
      }
      

      最终打印出来的结果是0,2,4

      有点懵逼,从结果倒推,感觉是分别做了0 * 2,1 * 2,2 * 2,也就是说i分别代表的是0,1,2三个数

      我们直接打开Array.kt

       /**
        * Represents an array (specifically, a Java array when targeting the JVM platform).
        * Array instances can be created using the [arrayOf], [arrayOfNulls] and [emptyArray]
        * standard library functions.
        * See [Kotlin language documentation](http://kotlinlang.org/docs/reference/basic-types.html#arrays)
        * for more information on arrays.
        */
       public class Array {
           /**
            * Creates a new array with the specified [size], where each element is calculated by calling the specified
            * [init] function. The [init] function returns an array element given its index.
            */
           public inline constructor(size: Int, init: (Int) -> T)
       }
      

      两段比较重要的解释,一个是产生一个specified [size]的array,另一个是returns an array element given its index,重点在index,那就不难理解了,直接lambda的话就是箭头左边的用的index

      同时我们从lambda的表达式,可以看得出来,最终Array中的泛型T的判断来自于表达式的箭头右侧的值

      比如如下:

       //kotlin会判断为  Array
      val e = Array(3, { i -> (i * 2) })
       //kotlin会判断为  Array
       val f = Array(3, { i -> "$i , hello"})
      

      此处的也可以直接IntArray或者xxxArray来代替让kotlin自己判断的Array

  • 字符串

    三个"可以用来描述多行字符串

    val text = """
     |多行字符串
     |菜鸟教程
     |多行字符串
     |Runoob
     """
    

    由于md没有kotlin格式,所以看起来怪怪的,但是实际上是可以输出多行的。

    trimMargin方法,类似于java中的trim,只是由于kotlin支持了多行的String形式,所以trimMargin不单单要做的是去除空格,还有去掉每一行多余的部分,我们来看源码

    public fun String.trimMargin(marginPrefix: String = "|"): String =
     replaceIndentByMargin("", marginPrefix)
    

    默认的前缀是|,所以所有|之前的内容会被直接干掉。我们也可以自定义前缀字符穿进去,比如 trimMargin(">")

kotlin中,可以用Char来遍历String

for(c in text){
    println(c)
}

字符串模板使用的是"$"的形式,可以直接跟参数名,或者{表达式}

 val i = 10
 val s = "i = $i" // 求值结果为 "i = 10"
 println(s)

需要打出具体字符,比如$的方式为

"${'$'}"
  • 可空boolean

    布尔类型是可空的,此处记住要用== true,而不是我们通常直接将boolean直接放入if判断

    val b: Boolean? = ……
      if (b == true) {
          ……
      } else {
          // `b` 是 false 或者 null
      }
    
  • 无符号数Uxxx

    从kotlin1.3开始,引入了无符号数类型,分别对应的UInt``ULong``UShort``UByte,均只有正数,没有负数。

    对应的也带来了相应的array,UByteArray``UShortArray``UIntArray``ULongArray


Kotlin学习笔记之 1 基础语法

Kotlin学习笔记之 2 基本数据类型

Kotlin学习笔记之 3 条件控制

Kotlin学习笔记之 4 循环控制

Kotlin学习笔记之 5 类和对象

Kotlin学习笔记之 6 继承

Kotlin学习笔记之 7 接口

Kotlin学习笔记之 8 扩展

Kotlin学习笔记之 9 数据类与密封类

Kotlin学习笔记之 10 泛型

Kotlin学习笔记之 11 枚举类

Kotlin学习笔记之 12 对象表达式和对象声明

Kotlin学习笔记之 13 基础操作符run、with、let、also、apply

Kotlin学习笔记之 14 包与导入

Kotlin学习笔记之 15 伴生对象

Kotlin学习笔记之 16 委托

Kotlin学习笔记之 17 可观察属性

Kotlin学习笔记之 18 函数

Kotlin学习笔记之 19 高阶函数与 lambda 表达式

Kotlin学习笔记之 20 内联函数

Kotlin学习笔记之 21 解构声明

Kotlin学习笔记之 22 集合

Kotlin学习笔记之 23 相等判断

Kotlin学习笔记之 24 操作符重载

Kotlin学习笔记之 25 异常捕捉

Kotlin学习笔记之 26 反射

Kotlin学习笔记之 27 类型别名

Kotlin学习笔记之 28 协程基础

Kotlin学习笔记之 29 上下文与调度器

Kotlin学习笔记之 30 协程取消与超时

Kotlin学习笔记之 31 协程挂起函数的组合

Kotlin学习笔记之 32 协程异常处理

Kotlin学习笔记之 33 协程 & Retrofit

你可能感兴趣的:(Kotlin学习笔记之 2 基本数据类型)