1. 概述
在本文中,我们将介绍如何在 Kotlin 中初始化数组。
Kotlin 提供了多种方式来创建和初始化数组,包括普通对象数组和基本类型数组。我们将通过示例来展示这些方法,并讨论一些常见用法和注意事项。
2. 使用 arrayOf 库函数
Kotlin 提供了内置的 arrayOf
方法,用于将传入的值转换为对应类型的数组:
val strings = arrayOf("January", "February", "March")
上面的代码创建了一个 Array<String>
类型的数组,数组中的元素类型为 String
。
✅ 注意:arrayOf
方法适用于对象类型,如果你传入的是基本类型,Kotlin 会自动装箱为对应的包装类(如 Int
转为 Integer
),这可能带来性能开销。
3. 基本类型数组
除了对象数组,Kotlin 也支持专门的基本类型数组。使用 arrayOf
时传入基本类型虽然可行,但会触发自动装箱,影响性能。
为避免这个问题,Kotlin 提供了专门针对基本类型的数组函数,包括:
intArrayOf
doubleArrayOf
floatArrayOf
longArrayOf
charArrayOf
shortArrayOf
byteArrayOf
booleanArrayOf
示例如下:
val integers = intArrayOf(1, 2, 3, 4)
上面的代码创建了一个 IntArray
类型的数组,内部存储的是原始 int
值,而不是装箱对象,效率更高。
4. 延迟初始化数组(通过索引)
有时候我们不希望在创建数组时就初始化所有元素。这时可以先创建一个包含 null
的数组:
val array = arrayOfNulls<Number>(5)
然后,我们可以使用 Kotlin 提供的 indices
属性来遍历数组索引,并逐个赋值:
for (i in array.indices) {
array[i] = i * i
}
这种方式适合需要根据索引动态生成数组内容的场景。
5. 创建空数组
Kotlin 提供了创建空数组的方法,例如:
val emptyStringArray = emptyArray<String>()
该方法返回一个长度为 0 的 Array<String>
。
⚠️ 注意:与 arrayOfNulls<String>(0)
不同的是,emptyArray()
创建的是一个没有元素的数组,而不是包含 null
元素的数组。
对于基本类型,Kotlin 也提供了对应的空数组创建方法,例如:
intArrayOf()
doubleArrayOf()
- ...
6. 使用初始化函数生成数组
Kotlin 的数组构造函数支持传入一个初始化函数,用于动态生成数组元素。适用于对象数组和基本类型数组。
例如,创建一个包含平方数的 IntArray
:
val generatedArray = IntArray(10) { i -> i * i }
上面的代码创建了一个长度为 10 的数组,元素为索引的平方值。
同样适用于对象数组:
val generatedStringArray = Array(10) { i -> "Number of index: $i" }
这种写法非常简洁,推荐在需要动态生成数组内容时使用。
7. 从 IntRange 初始化 IntArray
Kotlin 提供了 IntRange
类型,用于表示一个整数区间:
val intRange = 1..10 // 包括 1 和 10
但如果我们想从 IntRange
创建一个 IntArray
,Kotlin 并没有直接支持的方法。通常的做法是:
val intArray = intRange.toList().toIntArray()
虽然可行,但这种方法会创建中间的 List
对象,不够高效,尤其在范围较大时。
✅ 推荐做法:扩展函数
我们可以为 IntRange
编写一个扩展函数,直接生成 IntArray
,避免中间对象:
fun IntRange.toIntArray(): IntArray {
val result = IntArray(this.count())
var index = 0
for (element in this) {
result[index++] = element
}
return result
}
使用方式如下:
val intRange = 1..10
val intArray = intRange.toIntArray()
这样可以显著减少内存开销,是一个更优的实现方式。
8. 小结
本文介绍了 Kotlin 中初始化数组的多种方式:
- 使用
arrayOf
创建对象数组 - 使用
intArrayOf
等方法创建基本类型数组 - 使用
arrayOfNulls
创建可延迟初始化的数组 - 使用
emptyArray
创建空数组 - 使用带初始化函数的构造方法动态生成数组
- 从
IntRange
高效创建IntArray
这些方法各有用途,根据具体场景选择合适的方式可以提升代码的可读性和性能。
完整代码示例可在 GitHub 上查看。