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])
}