從零開始學 Kotlin 之「2」資料型別
前言
大家好,這裡是「從零開始學 Kotlin 之『2 』資料型別」,本文首發於公眾號「Binguner」,歡迎前往大家關注。我會每週分享一些關於 Android 和其他方向的技術乾貨或一些關於認知的文章。學習一門技術最好的方式就是去教會別人,所以,開始今天的學習吧!
Kotlin 中的資料型別有 基本資料型別 和 應用型別 :
- 基本資料型別值直接存在了變數
- 應用型別的變數儲存的是型別所指物件的儲存地址
並且對於基本的資料型別(類似於 int,float 等),Kotlin 不會區分其是資料型別還是包裝型別,在執行的時候,資料會用最高效的方式顯示。
01 數字
Kotlin 提供了與 Java 類似的數字型別
型別 | 位寬度 |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
01 - 1 轉換函式
但是要注意:Kotlin 中沒有隱式轉換(就像 Java 中可以把 Int 轉換為 Long),想要進行數字轉換,需要使用 轉換函式 :
val a:Byte = 1 val b:Int = a// 錯誤,編譯器會提示所需型別為 Int,而提供的型別為 Byte val c:Int = a.toInt()// 成功
每種數字型別都支援以下的數字轉換方法:
- toByte(): Byte
- toShort(): Short
- toInt(): Int
- toLong(): Long
- toFloat(): Float
- toDouble(): Double
- toChar(): Char
01 - 2 裝箱和拆箱
裝箱是指將基本資料型別轉換為其對應的包裝器型別,
拆箱就是將包轉器型別轉換為基本資料型別。
在 Java 中:
Integer x = 123;// 是一個裝箱操作 int y = x;// 是一個拆箱操作
而 Kotlin 中如何裝箱拆箱呢?
val i1 = 123// 拆箱 val i2:Int? = 123 // 裝箱
想要了解其背後具體原理,可以自己動手將 Kotlin 程式碼編譯成 Java 位元組碼一探究竟。
02 字面常量
為基本資料型別賦值的值稱為字面常量。
Kotlin 中的字面常量有以下三種:
- 十進位制
類似:123,Long 型別的用大寫 L 標記:123L - 十六進位制
類似:0x0F - 二進位制
類似:0b00001011
另外,Kotlin 並不支援八進位制。但卻預設支援 Double 和 Float。
例如:123.5,123.4e10,123f,123F 這些在 Kotlin 中都是支援的。
在宣告字面常量時,Kotlin 支援下劃線的宣告方式,使數字更加的易讀:
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
03 字元
Kotlin 中的字元使用 Char 表示,字元不能直接被當作數字來處理,必須通過 toInt() 方法被字元轉換為數字型別
fun charToInt(c:Char):Int{ return c.toInt() }
Char 類的字面量用「' '」括起來,支援如下的轉義序列:
- \t
- \b
- \n
04 字串
Kotlin 中的字串和 Java 一樣用 String 申明,且不可變的。但是 Kotlin 中的字串有一些新的特性。
04 - 1 新特性
- 通過下標訪問字串中的單個字元
val str = "Hello world!" for (i in 0..str.length-1){ print("${str[i]}_") }// 輸出 H_e_l_l_o_ _w_o_r_l_d_!_
- 直接通過「+」操作符連線字串
val s = "Hello" + '_' println(s + "World") // 輸出 Hello_World
04 - 2 字串處理
- 用 split() 分割字串(split 函式的引數是一個 Regex 物件,寫好正則表示式後用 toRegex() 方法即可)
println("123_456_789".split("_".toRegex())) // 輸出 [123, 456, 789]
- 用其它方法分割字串
- substring() 從指定位置開始分割字串,或者提取指定範圍的字串
- substringBefore() 分割掉指定位置之後的字串
- substringAfter() 分割掉指定位置之前的字串
- substringBeforeLast() 分割最後一個指定字元之後的字串
- substringAfterLast() 分割最後一個指定字元之前的字串
val str = "Hello world!" println("substring1: ${str.substring(5)}") println("substring2: ${str.substring(0..4)}") println("substring3: ${str.substring(6,12)}") println("substringBefore: ${str.substringBefore(" ")}") println("substringAfter: ${str.substringAfter(" ")}") println("substringAfter: ${str.substringBeforeLast(" ")}") println("substringAfterLast: ${str.substringAfterLast(" ")}") // 執行結果: substring1:world! substring2: Hello substring3: world! substringBefore: Hello substringAfter: world! substringAfter: Hello substringAfterLast: world!
04 - 3 原始字串
原始字串用前後 3 個引號包圍
val rawStr = """ The first line, the second line, the third line. """.trimIndent()// 注意:如果「"""」所在行只有空格,這個方法會省略這些空白 println(rawStr) // 輸出: The first line, the second line, the third line.
原始字串通常還用 trimMargin() 處理,trimMargin() 的引數是一個邊界字首字串,預設的引數是「|」,例如下面的例子,每一行的開頭是「|」,那麼就會以每一行的「|」為輸出的開頭進行字元輸出。
val rawStr = """ |The first line, |the second line, |the third line. """.trimMargin("|") // 輸出: The first line, the second line, the third line.
05 布林型別
Kotlin 中的布林型別用 Boolean 表示,它的值有 true 和 false。
若需要可空引用時,布林型別的值會被裝箱。
它支援的運算有:
- || 短路邏輯或
- && 短路邏輯與
- ! 邏輯非
06 可空的基本資料型別
Kotlin 致力於消除 NullPointerException 帶來的影響。在 Java 中如果我們嘗試引用一個空的物件,就會導致空指標異常,但是在 Kotlin 中則不會。下面,我們來看看 Kotlin 是怎麼做到的。
Kotlin 對可空型別和非空型別做了區分,例如:「Int」不可空,「Int?」可空
var str :String? = null println(str?.length) // 輸出 null,而不是報空指標異常
在引用可空型別的時候,為了避免空指標異常,Kotlin 要求必須進行非空檢查:
var str :String? = "Hellp" // val length1 = str.length 這樣直接引用的時候,編譯器會報錯 //Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String? // 必須在可空型別上使用可空和非空斷言。 val length = str?.length// 此時如果 str 為空,執行返回 null val length2 = str!!.length// 此時如果 str 為空,執行會丟擲異常 // 或者進行型別檢查 val length3 = if(str != null) str.length else 0
07 Kotlin 中的一些其它型別
07 - 1 Any、Any?
Any 是 Kotlin 中所有非空型別的超類,相當於 Java 中的 Object。
可空型別的超類是 Any?
07 - 2 Unit
Unit 可以作為函式的返回型別,表示沒有返回值或者返回值可以忽略。
注意 Unit 是一個類,並且繼承自 Any。
這是定義它的原始碼:
public object Unit { override fun toString() = "kotlin.Unit" }
可以看到 Unit 是用 object 定義的單例型別,呼叫它的 toString() 方法,只會返回 「Kotlin.Unit」。
並且 Unit 的返回型別會返回 Unit 型別!!!
fun test(){} val t = test() println(t::class.java) // 輸出 class kotlin.Unit
07 - 3 Nothing
Kotlin 中函式返回型別如果用 Nothing 表示,則這個函式 永遠不會返回任何型別。
一些測試函式不會返回任何型別,就需要宣告返回型別為 Nothing,它們通常丟擲異常來結束執行。
fun test(msg:String):Nothing{ throw IllegalStateException(msg) } test("test") // 此時程式會丟擲異常:Exception in thread "main" java.lang.IllegalStateException: test
最後
「從零開始學 Kotlin 之『2』資料型別」到這裡就結束了。
一下記住這麼多知識點有些困難,所以為了方便大家的記憶與複習,我做了一張思維導圖放到下面,大家可以把圖片儲存下來,有時間便去回顧學到的東西。

從零開始學 Kotlin 之「2」資料型別
推薦閱讀:
歡迎關注本文作者,這個系列的文章會首發在這裡:

啥都喜歡寫的碼農
掃碼關注 + 回覆「kotlin」,獲取我整理的最新版 Kotlin 學習視訊。