这两者的主要区别是什么:
val array: Array<Double> = arrayOf()
与
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);
}
与
jdoubleArray res = env->NewDoubleArray(elementCount);
env->SetDoubleArrayRegion(res, 0, elementCount, array);
没有任何代价(实际上,由于没有装箱,它会更快),但是,与Java中的原始类型一样,如果您希望将它们与一起使用,它将迫使您为某些方法创建专门的重载[Int/Double/etc]Array
。
整数数组的内存布局与对象指针数组的内存布局完全不同。
Norswap在该讨论中的评论很好地总结了权衡:
原生的[
int[]
/IntArray
]读/写速度更快,但是包装的[Integer[]
/Array<Int>
]不需要在每次跨越通用边界时都进行完全转换。
#7,norswap
例如,接受Array<Int>
(Integer[]
在JVM上)的函数将不接受IntArray
(int[]
)。
您已经列出了唯一的实际区别,其中一个被编译为原始类型,另一个被编译double[]
为Double[]
。但是,Double[]
是一个对象数组,因此double
每次您通过将值设置为来修改数组或检索时double
,将分别执行装箱和拆箱。
DoubleArray
出于速度和内存原因,通常建议改用它。
作为对象包装器造成的速度损失的示例,请看一下这篇文章的开头,摘自Effective Java:
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秒。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句