Kotlin 的數組.

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

1. 建立一個數組

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

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

但通常建立數組時不會使用 Array 類的構造函數,咱們須要分三種狀況建立數組:app

  1. 建立已知全部元素的數組:ide

    若是咱們須要把一組已知的數據放在一個新建的數組裏,通常使用 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。spa

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

    // 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 類同樣的操做方式。

相關文章
相關標籤/搜索