这两者的主要区别在于:
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);
答案 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[]
)的函数将不接受IntArray
(int[]
)。
您已经列出了唯一真正的区别,一个编译为原始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秒。