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

首发于公众号: 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<Int> {
    

    我们看到,所描述的是表示一个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<Int>,两者不能相互赋值!

      补充(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<T> {
           /**
            * 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>中的泛型T的判断来自于表达式的箭头右侧的值

      比如如下:

       //kotlin会判断为  Array<Int>
      val e = Array(3, { i -> (i * 2) })
       //kotlin会判断为  Array<String>
       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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容