數組是一種數據結構,它保存固定數量的相同類型或其子類型的值。kotlin
中最常見的數組類型是對象類型數組,數組由array
類表示。
什么時候使用
當你在kotlin
中有特殊的底層需求需要滿足時,可以使用數組。例如,如果你有超出常規應用所需的性能要求,或者你需要構建自定義的數據結構。如果你沒有這些限制,那么可以使用集合(Collections)。
與數組相比,集合有以下優點:
- 集合可以是只讀的,這給你提供了更多的控制權,使你能夠編寫具有明確意圖的健壯代碼。
- 從集合中添加或刪除元素很容易。相比之下,數組的大小是固定的。從數組中添加或刪除元素的唯一方法是每次都創建一個新的數組,這非常低效。
fun main() {val riversArray1 = arrayOf("Nile", "Amazon", "Yangtze")val riversArray2 = riversArray1 + "Mississippi"println(riversArray1.joinToString()) // Nile, Amazon, Yangtzeprintln(riversArray2.joinToString()) // Nile, Amazon, Yangtze, Mississippi }
- 可以使用
==
來比較兩個集合是否相同,但是不能使用該操作來比較數組
創建數組
arrayOf()
,arrayOfNulls()
,emptyArray()
fun main() {val simpleArray = arrayOf(1, 2, 3)println(simpleArray.joinToString()) // 1, 2, 3val nullArray: Array<Int?> = arrayOfNulls(3)println(nullArray.joinToString()) // null, null, nullval exampleArray1 = emptyArray<String>()val exampleArray2: Array<String> = emptyArray()println(exampleArray1.joinToString()) // 空println(exampleArray2.joinToString()) // 空 }
Array
的構造方法Array構造函數接受數組大小和一個函數,該函數根據數組的索引返回數組元素的值
fun main() {val initArray = Array<Int>(3) { 0 }println(initArray.joinToString()) // 0, 0, 0val asc = Array(5) { i -> (i * i).toString() }println(asc.joinToString()) // 014916 }
嵌套數組
fun main() {// 兩層嵌套val twoDArray = Array(2) { Array<Int>(2) { 0 } }println(twoDArray.contentDeepToString()) // [[0, 0], [0, 0]]// 三層嵌套val threeDArray = Array(3) { Array(3) { Array<Int>(3) { 0 } } }println(threeDArray.contentDeepToString()) // [[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
}
嵌套數組可以是不通長度不同類型
獲取/修改
數組中的元素是可變的,如果想要獲取和修改數組中的元素需要使用[索引]
來操作
fun main() {val simpleArray = arrayOf(1, 2, 3)val twoDArray = Array(2) { Array<Int>(2) { 0 } }// 修改元素simpleArray[0] = 10twoDArray[0][0] = 2println(simpleArray[0].toString()) // 10println(twoDArray[0][0].toString()) // 2
}
使用數組
在kotlin
中,數組可以作為方法的可變數量參數
使用,也可以對數組本身做操作,如比較數組、轉換數組內容,轉成集合等
可變數量參數
可變數量參數使用vararg
聲明,傳遞參數前使用*
fun main() {val lettersArray = arrayOf("c", "d")printAllStrings("a", "b", *lettersArray)// abcd
}fun printAllStrings(vararg strings: String) {for (string in strings) {print(string) }
}
比較
對比數據需要使用.contentEquals()
或者.contentDeepEquals()
方法
fun main() {val simpleArray = arrayOf(1, 2, 3)val anotherArray = arrayOf(1, 2, 3)println(simpleArray.contentEquals(anotherArray)) // true// 修改元素simpleArray[0] = 10 println(simpleArray contentEquals anotherArray) // false
}
常用方法
求和
fun main() {val sumArray = arrayOf(1, 2, 3)println(sumArray.sum()) // 6
}
洗牌(打亂順序)
隨機打亂順序
fun main() {val simpleArray = arrayOf(1, 2, 3)simpleArray.shuffle()println(simpleArray.joinToString()) // 1, 3, 2simpleArray.shuffle()println(simpleArray.joinToString()) // 2, 1, 3
}
轉成集合
轉成List
或者Set
使用.toList()
或者.toSet()
方法
fun main() {val simpleArray = arrayOf("a", "b", "c", "c")println(simpleArray.toSet()) // [a, b, c]println(simpleArray.toList())// [a, b, c, c]
}
轉成Map
使用.toMap
方法
只有鍵值對數組才能轉成Map
fun main() {val pairArray = arrayOf("apple" to 120, "banana" to 150, "cherry" to 90, "apple" to 140)println(pairArray.toMap()) // {apple=140, banana=150, cherry=90}
}
基本類型數組
如果使用上文中的數組,數據類型會被包裝成Object
類型,如果需要存儲基本數據類型的元素,可以使用基本數據類型數組,避免開裝箱造成的性能損失
基本類型數組有
BooleanArray
ByteArray
CharArray
DoubleArray
FloatArray
IntArray
LongArray
ShortArray
雖然這寫類和Array
沒有繼承關系,但是具有相同的方法
Object
類型數組和基本類型數組可以互轉
fun main() {val intObjArray = arrayOf(1, 2, 3, 4)intObjArray.toIntArray() // 轉成Int數組val intArray = intArrayOf(1, 2, 3, 4)intArray.toTypedArray() // 轉成Object數組val booleanArray = booleanArrayOf(false, true)booleanArray.toTypedArray()val booleanObjArray = arrayOf(false, true)booleanObjArray.toBooleanArray()
}