Kotlin 的數組.

Kotlin 中的數組採用 Array<T> 類定義,拋棄了類 C 語言中 “元素類型[]”的定義方式。下面我們詳細講講如何在 Kotlin 中使用數組:

1. 創建一個數組

Array<T> 類有兩個構造方法:

class Array<T> private constructor() { //私有的 Array<T>() 方法,構造一個空數組
 public inline constructor(size: Int, init: (Int) -> T) //構造使用 init 函數計算元素值的數組}

但一般創建數組時不會使用 Array 類的構造函數,我們需要分三種情況創建數組:

  1. 創建已知所有元素的數組:

    如果我們需要把一組已知的數據放在一個新建的數組裏,一般使用 kotlin.arrayOf() 函數。先看一下它的定義:

    // kotlin.Library.ktpublic inline fun <reified @PureReifiable T> arrayOf(vararg elements: T): Array<T>

    其他的東西我們先不管,從這裏看到:arrayOf() 參數接收數量不定的 T 類型的元素,並使用它們創建一個數組,然後返回這個數組。我們看下例子:

    val a = arrayOf("Hello", "world")// a = ["Hello", "world"]

    這裏,arrayOf() 函數創建了一個 Array<String> 對象,包含兩個元素 "Hello","world",並將它賦給變量 a。

    如果我們想像 Java 中那樣創建一個長度指定,每個值都是 null 的數組,就要用 kotlin.arrayOfNulls() 函數:

    // kotlin.Library.ktpublic fun <reified @PureReifiable T> arrayOfNulls(size: Int): Array<T?>

    它可以接收一個指定的數組長度,返回一個長度指定、所有值都是 null 的數組:

    var nullArray: Array<String?> = arrayOfNulls(2)// a = [null, null]

    如果我們想依照一定的規律創建一個數組,這時候就要用上構造函數了。比如,我們想創建一個長度爲 10 的 Int 類型數組,包含從 1 到 10 的平方,我們可以這樣寫:

    val squares = Array<Int>(10, { i -> (i+1)*(i+1) })// squares = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

    構造函數的第一個參數是數組的長度,這裏指定數組的長度是 10;後面是一個 Lambda 表達式,是指定每個元素值的方法,其中的 i 指元素的索引值。

  2. 創建一個空數組

    如果我們需要一個空的數組,Kotlin 提供了 kotlin.ArrayIntrinsics.emptyArray() 函數:

    public inline fun <reified @PureReifiable T> emptyArray(): Array<T> =
           @Suppress("UNCHECKED_CAST")
           (arrayOfNulls<T>(0) as Array<T>)

    可以看到,emptyArray() 函數是創建一個長度爲 0 的 null 數組,然後將它強制轉換爲指定類型的數組。所以我們可以用 arrayOfNulls<T>(0) 替代 emptyArray() 函數:

    //因爲 emptyArray() 函數需要轉換爲特定的數組類型,所以定義變量需要指定數組類型,否則出現編譯錯誤val emptyArray1: Array<String?> = emptyArray()//也可以寫成 val emptyArray2: Array<String?> = arrayOfNulls(0),這裏是類型推斷val emptyArray2 = arrayOfNulls<String?>(0)println(Arrays.equals(emptyArray1, emptyArray2)) // 輸出 true

  3. 創建基本類型數組

    Kotlin 對於基本類型數組有特殊的優化,建議在涉及到基本類型的數組時使用下面列出的類,而不使用 Array 類。

    比如,對於 Int 類型數組,建議使用 IntArray 類替代 Array<Int> 類:

    val intArray = intArrayOf(1, 2, 3)// intArray = [1, 2, 3]val arrayOfInt = arrayOf(1, 2, 3)// arrayOfInt = [1, 2, 3]

    需要注意的一點是,IntArray 類並不是 Array 類的子類,所以上面兩個數組並不是相同的對象:

    val isSame = Arrays.equals(intArray, arrayOfInt)// 編譯錯誤,不同類型的數組

    對於其他基本數據類型,也有同樣的數組類,它們有與 Array 類一樣的操作方式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章