- 對(duì)象數(shù)組
- 基本數(shù)據(jù)類型數(shù)組
??數(shù)據(jù)容器是基于某種數(shù)據(jù)結(jié)構(gòu)的,常見的數(shù)據(jù)結(jié)構(gòu)有數(shù)組 (Array)蹈胡、集 (Set)渊季、隊(duì)列 (Queue)朋蔫、鏈表 (Linkedlist)、樹 (Tree)梭域、堆 (Heap)斑举、棧 (Stack) 和 映射 (Map) 等結(jié)構(gòu)搅轿。
- 數(shù)組
??數(shù)組 (Array) 是一種罪基本的數(shù)據(jù)結(jié)構(gòu)病涨,數(shù)組具有三個(gè)基本特性:
??(1) 一致性。數(shù)組只能保持相同數(shù)據(jù)類型的元素璧坟;
??(2) 有序性既穆。數(shù)組中的元素是有序的,通過下標(biāo)訪問雀鹃,數(shù)組的下標(biāo)從零開始幻工;
??(3) 不可變性。數(shù)組一旦初始化黎茎,則長(zhǎng)度(數(shù)組中元素的個(gè)數(shù))不可變囊颅。
??為兼容 Java 中數(shù)組和提高訪問效率,Kotlin 將數(shù)組分為 對(duì)象數(shù)組 和 基本數(shù)據(jù)類型數(shù)組傅瞻。
一踢代、對(duì)象數(shù)組
??kotlin 對(duì)象數(shù)組是 Array<T>,其中只能保存對(duì)象嗅骄,這里對(duì)象對(duì)應(yīng)的是 Java 中的對(duì)象胳挎,例如 Java 中的 int 只是基本數(shù)據(jù)類型,而 Integer 才是 Java 對(duì)象溺森。
??下面是 Kotlin 中8種數(shù)據(jù)類型數(shù)組慕爬,與編譯后的 Java 代碼比較。
// kotlin 8種基本數(shù)據(jù)類型數(shù)組
fun main(args: Array<String>?) {
val ints: Array<Int> = arrayOf(1)
val shorts: Array<Short> = arrayOf(1)
val btyes: Array<Byte> = arrayOf(3)
val longs: Array<Long> = arrayOf(34)
val floats: Array<Float> = arrayOf(23.2f)
val doubles: Array<Double> = arrayOf(3.3)
val chars: Array<Char> = arrayOf('a')
val booleans: Array<Boolean> = arrayOf(false)
}
// kotlin 通過轉(zhuǎn)換編譯后的 java 代碼
@Metadata(
mv = {1, 1, 15},
bv = {1, 0, 3},
k = 2,
d1 = {"\u0000\u0014\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\b\u0002\u001a\u001b\u0010\u0000\u001a\u00020\u00012\u000e\u0010\u0002\u001a\n\u0012\u0004\u0012\u00020\u0004\u0018\u00010\u0003¢\u0006\u0002\u0010\u0005¨\u0006\u0006"},
d2 = {"main", "", "args", "", "", "([Ljava/lang/String;)V", "kotlin_module"}
)
public final class WwwwKt {
public static final void main(@Nullable String[] args) {
Integer[] var10000 = new Integer[]{1};
Short[] var9 = new Short[]{Short.valueOf((short)1)};
Byte[] var10 = new Byte[]{3};
Long[] var11 = new Long[]{34L};
Float[] var12 = new Float[]{23.2F};
Double[] var13 = new Double[]{3.3D};
Character[] var14 = new Character[]{'a'};
Boolean[] var15 = new Boolean[]{false};
}
}
??注意:通過上面的編譯對(duì)比屏积,kotlin 對(duì)象數(shù)組中保存的8中基本類型的數(shù)據(jù)医窿,他們都會(huì)編譯成 Java 包裝類數(shù)組,而不是 Java 基本數(shù)據(jù)類型數(shù)組炊林。即如下對(duì)應(yīng)關(guān)系:
kotlin 對(duì)象數(shù)組 | Java包裝類數(shù)組 |
---|---|
Array<Byte> | java.lang.Byte[] |
Array<Short> | java.lang.Short[] |
Array<Int> | java.lang.Integer[] |
Array<Long> | java.lang.Long[] |
Array<Float> | java.lang.Float[] |
Array<Double> | java.lang.Double[] |
Array<Char> | java.lang.Char[] |
Array<Boolean> | java.lang.Boolean[] |
二姥卢、基本數(shù)據(jù)類型數(shù)組
kotlin 中創(chuàng)建對(duì)象數(shù)組有3中方式:
arrayOf(vararg elements: T) 工廠函數(shù):指定數(shù)組元素列表,創(chuàng)建元素類型為 T 的數(shù)組铛铁,vararg 表明參數(shù)個(gè)數(shù)是可變的隔显。
arrayOfNulls<T>(size: Int) 函數(shù):size 參數(shù)指定數(shù)組大小,創(chuàng)建元素為 T 的數(shù)組饵逐,數(shù)組中的元素為空值(即:null)括眠。
Array(size: Int, init: (Int) -> T) 構(gòu)造函數(shù):通過 size 參數(shù)指定數(shù)組大小,init 參數(shù)指定一個(gè)用于初始化元素的函數(shù)倍权,實(shí)際使用時(shí)經(jīng)常是 Lambda 表達(dá)式掷豺,索引值從0開始捞烟。
fun <T> printArray(array: Array<T>) {
val printStr = if (array.isEmpty()) "[]" else array.joinToString(", ", "[", "]")
println(printStr)
}
fun main(args: Array<String>?) {
val array1 = arrayOf(1, 2, 4, 5, 6)
val array2 = arrayOfNulls<Char>(3)
array2[0] = 'a'
array2[1] = 'b'
val array3 = Array<Int>(5) { it * it } // 尾隨lambda表達(dá)式
val array4 = Array<String>(3) { i -> "張家老$i" }
val array5 = arrayOfNulls<Boolean>(0)
printArray(array1)
printArray(array2)
printArray(array3)
printArray(array4)
printArray(array5)
}
2019-06-12 10:40:30.649 5875-5875/cn.ak.kot I/System.out: [1, 2, 4, 5, 6]
2019-06-12 10:40:30.650 5875-5875/cn.ak.kot I/System.out: [a, b, null]
2019-06-12 10:40:30.650 5875-5875/cn.ak.kot I/System.out: [0, 1, 4, 9, 16]
2019-06-12 10:40:30.650 5875-5875/cn.ak.kot I/System.out: [張家老0, 張家老1, 張家老2]
2019-06-12 10:40:30.650 5875-5875/cn.ak.kot I/System.out: []
??Array(size: Int, init: (Int) -> T)
構(gòu)造函數(shù)可以表示為Array<Int>(10, {i -> i * i})
或者Array<Int>(10){i -> i * i}
,后者稱為尾隨 Lambda 表達(dá)式当船,使用尾隨 Lambda 表達(dá)式的前提是题画,一個(gè)函數(shù)的最后一個(gè)參數(shù)是函數(shù)類型,在用 Lambda 表達(dá)式為實(shí)際參數(shù)時(shí)德频,可以將 Lambda 表達(dá)式移到函數(shù)的小括號(hào)之后苍息,詳細(xì)關(guān)于 Lambda 表達(dá)式使用可以查看《Kotlin函數(shù)式編程 (2)Lambda表達(dá)式》。