Java数组

Kotlin数组是不可变的,与Java不同。这意味着Kotlin不允许我们给Array<Any>赋值给Array<String>,这将避免可能的潜在运行时错误。传递子类数组作为超类数组的方法也是被禁止的,但是对Java方法来说这样确实允许的。

在Java平台的原生数据类型的数组可以避免装箱/拆箱的代价。因为Kotlin隐藏了这些实现细节,需要一个变通的方法来与Java代码交互。对原生数组的所有类型的特殊类(IntArray、DoubleArray、CharArray等)来处理这种情况。这些类与Array无关,并且被编译成了Java原生数组获取最大的性能。

假设一个Java方法接收一个整数数组:

public class JavaArrayExample {

    public void removeIndices(int[] indices) {
        // code here...
    }
}

为了传递原始值的数组,你可以按照如下的方式:

val javaObj = JavaArrayExample()
val array = intArrayOf(0, 1, 2, 3)
javaObj.removeIndices(array) // passes int[] to method

当编译成JVM字节码时,编译器会优化访问数组,因此没有额外的性能消耗:

val array = arrayOf(1, 2, 3, 4)
array[x] = array[x] * 2 // no actual calls to get() and set() generated
for (x in array) { // no iterator created
    print(x)
}

甚至我们使用索引访问时也不会引入额外的开销:

for (i in array.indices) { // no iterator created
    array[i] += 2
}

最后,in检查也不会有其他的限制:

if (i in array.indices) { // same as (i >= 0 && i < array.size)
    print(array[i])
}

results matching ""

    No results matching ""