Kotlin 基礎 - 資料型別

想念你的Android發表於2019-03-13

一、Boolean 型別

Boolean 值有兩個值,分別為 truefalse。多數情況下,Kotlin 中的 Boolean 相當於 Java 中的基本型別 boolean,只有在必要的情況下才會裝箱成為 Java 中的裝箱型別 Boolean。這一切都是交由編譯器來完成,我們無需關心。

var isFirst: Boolean = true
var isSecond: Boolean = false複製程式碼

二、Number 型別

Kotlin 基礎 - 資料型別

var aLong: Long = 123L
var aInt: Int = 1234567890
var aShort: Short = 12345

var aFloat: Float = 23F
var aDouble: Double = 23.0

var aByte: Byte = 127複製程式碼

基本型別的裝箱與拆箱
Kotlin 不再區分裝箱與非裝箱型別,在需要的時候編譯器會幫我們自動的選擇是使用基本型別還是裝箱型別。

三、Chat 型別

Chat 型別表示一個字元,一個字元可以是一個字,或者一個符號等等。
字元佔兩個位元組,表示一個 16 位的 Unicode 字元。
字元使用單引號 '' 引起來,例如 '中''A''\n'

Kotlin 基礎 - 資料型別

四、數值型別的顯式轉換

在 Java 裡面,將一個 int 值賦給 long 值,是可以允許的,因為 Int 的範圍比 long 要小,所以 long 可以相容 int。但是,在 Kotlin 中這樣的隱式轉換是不被支援的

var aInt: Int = 10
var    aLong: Long = 10000

// 編譯器會報錯
aLong = aInt

// 必須呼叫 toXXX 方法顯示轉換
aLong = aInt.toLong()複製程式碼

每個數值型別都支援下面的轉換

  • toLong:Long
  • toInt:Int
  • toShort:Short
  • toFloat:Float
  • toDouble:Double
  • toByte:Byte
  • toChar: Char
  • toString: String

五、字串型別

字串本質上可以說是"一串" Char,字串使用雙引號 "" 引起來

5.1 字串的比較

var aName: String = "fancyluo"
var bName: String = "fancyluo"

println(aName == bName) // true
println(aName === bName)// false複製程式碼

熟悉 Java 的同學對以上結果是不是就困惑了,怎麼 == 列印出來了 true,這裡我們可以看看== 的原始碼就可以解開疑惑了。

public open operator fun equals(other: Any?): Boolean
複製程式碼

Kotlin 的 == 就相當於 Java 的 equeals,表示比較內容。
Kotlin 的 === 就相當於 Java 的 ==,表示比較物件是否相同。


5.2 字串模板

在 Kotlin 中,字串可以包含模板表示式,模板表示式由 $ 開頭,如果需要進行表示式運算,可以寫在 {} 裡面

var a: Int = 1
var b: Int = 2

// Java
println("" + a + " + " + b + " = " + (a + b))

// 字串模板
println("$a + $b = ${a + b}")

// print: 1 + 2 = 3

// 原始字串
var rawString = """
    a
    b
    ${a + b}
"""複製程式碼

六、陣列

Kotlin 中的陣列由 Array 類表示,表示以一系列的物件,可以使用函式 arrayOf 來建立陣列,示例如下

val arrayOfString: Array<String> = arrayOf("fancy", "luo")
val arrayOfUser: Array<UserInfo> = arrayOf(
            UserInfo("fancyluo", "音樂"),
            UserInfo("jack", "籃球"))複製程式碼

可以看到,我們使用 val 來修飾陣列,在 Kotlin 中,陣列是不可變的。上面陣列裡我們放的都是物件,那麼基本型別的陣列呢?Kotlin 中為了防止裝箱拆箱的操作,為每個基本型別都專門定製了相應的陣列型別,從而避免過度裝箱的消耗。例如:IntArray,CharArray 等等。

val arrayOfInt: IntArray = intArrayOf(1, 2, 3)
val arrayOfChar: CharArray = charArrayOf('中', '國')複製程式碼

七、區間

區間是一個數學上的概念,表示範圍。Kotlin 中區間是 ClosedRange 介面的子類,一般比較常用的是 IntRange。

// 閉區間 [0,1024]
var range: IntRange = 0..1024
// 半開區間 [0,1024) = [0,1023]
var untilRange = 0 until 1024

fun main(args: Array<String>) {
    // 判斷是否在區間中
    print(666 in range))
    // 區間迭代
      for (i in range) {
        print("$i, ")
    }
}複製程式碼

八、空型別安全

fun getName(): String{
    return null
}複製程式碼

上面的程式碼在編譯器裡是會報錯的,普通情況下,Kotlin 中是不允許返回 null 型別的,這也就表明,我們在取這個值的時候,無需擔心,直接使用即可。那我們就是想返回 null 呢? 在返回值後面加個 ? 即可。

fun getName(): String?{
    return null
}複製程式碼

但是,返回了空型別之後,要使用這個函式就不是這麼簡單了,如果你並不確定此函式返回的是否為空,那麼你需要在函式後面加上一個?,如果你確定的知道此函式不會返回空,那麼你可以在函式後面加上 !! 表示我明確知道返回值不為空,可放心使用。

// 此行程式碼會報錯
var nameLength = getName().length

// 不確定是否為空
var nameLength = getName()?.length

// 確定不為空
var nameLength = getName()!!.length

// getName 不為空則返回值,為空則不再執行後面的邏輯
var nameLength = getName() ?: return複製程式碼


相關文章