Kotlin 中的數組採用 Array<T> 類定義,拋棄了類 C 語言中 「元素類型[]」的定義方式。下面咱們詳細講講如何在 Kotlin 中使用數組:java
Array<T> 類有兩個構造方法:數組
class Array<T> private constructor() { //私有的 Array<T>() 方法,構造一個空數組
public inline constructor(size: Int, init: (Int) -> T) //構造使用 init 函數計算元素值的數組}
但通常建立數組時不會使用 Array 類的構造函數,咱們須要分三種狀況建立數組:app
建立已知全部元素的數組: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 指元素的索引值。
建立一個空數組
若是咱們須要一個空的數組,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
建立基本類型數組
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 類同樣的操做方式。