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 上查看。


原始标题:Initializing Arrays in Kotlin