Kotlin - 使用Array <double>或DoubleArray

时间:2018-03-20 18:44:32

标签: arrays kotlin

这两者的主要区别在于:

val array: Array<Double> = arrayOf()

vs

val array: DoubleArray = doubleArrayOf()

我知道有人使用原始数据类型double,第二个是基于对象的countrepart Double

使用普通DoubleArray是否有任何惩罚或失误?

为什么我想知道:

我正在使用JNI,对于Double,我必须致电

 jclass doubleClass = env->FindClass("java/lang/Double");
 jmethodID doubleCtor = env->GetMethodID(doubleClass, "<init>", "(D)V");
 jobjectArray res = env->NewObjectArray(elementCount, doubleClass, nullptr);

 for (int i = 0; i < elementCount; i++){
    jobject javaDouble = env->NewObject(doubleClass, doubleCtor, array[i]);
    env->SetObjectArrayElement(res, i, javaDouble);
    env->DeleteLocalRef(javaDouble);
 }

VS

jdoubleArray res = env->NewDoubleArray(elementCount);
env->SetDoubleArrayRegion(res, 0, elementCount, array);

1 个答案:

答案 0 :(得分:3)

没有惩罚(事实上,由于没有装箱会更快),但是,与Java中的原始类型一样,它强制您创建某些方法的专门重载,如果您希望能够使用它们[Int/Double/etc]Array

This has actually been discussed over at the Kotlin forums

  

整数数组的内存布局与对象指针数组的内存布局完全不同。

Norswap在该讨论中的评论很好地总结了这种权衡:

  

原生的[int[] / IntArray]读取/写入速度更快,但包裹的[Integer[] / Array<Int>]不需要完全转换它跨过一般边界的时间   <子> #7, norswap

例如,接受Array<Int>(JVM上的Integer[])的函数将接受IntArrayint[])。

您已经列出了唯一真正的区别,一个编译为原始double[],另一个编译为Double[]。但是,Double[]对象的数组,因此每次通过将值设置为double或检索double来修改数组时,装箱和将分别执行拆箱。

出于速度和记忆的原因,通常建议使用DoubleArray

作为由于对象包装器引起的速度惩罚的一个例子,请看一下从{Effective *获取的this帖子的开头:

public static void main(String[] args) {
    Long sum = 0L; // uses Long, not long
    for (long i = 0; i <= Integer.MAX_VALUE; i++) {
        sum += i;
    }
    System.out.println(sum);
}

Long替换long会使运行时间从43秒减少到8秒。