Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure:what';[D和[Ljava.lang.Double;]之间的区别是什么;?_Java_Clojure - Fatal编程技术网

Clojure:what';[D和[Ljava.lang.Double;]之间的区别是什么;?

Clojure:what';[D和[Ljava.lang.Double;]之间的区别是什么;?,java,clojure,Java,Clojure,我正在尝试使用本机Java数组做一些工作,但我不理解两个双数组实例化之间的区别。这与装箱和取消装箱值有关吗?在下面的所有情况下(首先…)每个数组的类型都是java.lang.Double。Clojure协议似乎对这种区别很敏感 user> (class (make-array Double/TYPE 3)) ;; [D user> (class (double-array [1 2 3])) ;; [D user> (class (into-array (make-

我正在尝试使用本机Java数组做一些工作,但我不理解两个双数组实例化之间的区别。这与装箱和取消装箱值有关吗?在
下面的所有情况下(首先…)
每个数组的类型都是java.lang.Double。Clojure协议似乎对这种区别很敏感

user> (class (make-array Double/TYPE 3))  ;; [D
user> (class (double-array [1 2 3]))      ;; [D
user> (class (into-array (make-array Double/TYPE 3)))  ;; [Ljava.lang.Double;
user> (class (into-array (double-array [1 2 3])))      ;; [Ljava.lang.Double;
user> (class (into-array (repeat 2 (double-array [1 2 3]) ))) ;; [[D

双数组已解除绑定。当您从数组中访问项目时,Clojure会自动将其装箱,除非您使用需要该类型的类型提示函数访问该项目。

需要考虑两种不同类型的数组:

  • [D
    是一个原语双数组,相当于Java
    double[]
  • [Ljava.lang.Double;
    是一个包含
    Double
    引用的数组,相当于Java
    Double[]
(奇怪的表示法是因为这是这些类型在Java字节码中的内部表示形式……在Clojure中暴露出来有点奇怪,但你必须接受它)

因为这些是不同的类型,所以Clojure协议对它们的处理方式不同

如果您坚持原语双精度运算并避免任何不必要的装箱,则原语双精度数组通常提供更好的性能。您可以将原语数组视为未装箱值的数组,将引用数组视为装箱值的数组

使用引用数组的主要原因是,如果您的值在接收时已装箱,和/或您计划将其传递给需要装箱值的其他函数或集合。在这种情况下,取消装箱然后再次装箱是低效的,因此将其保留为装箱形式是明智的


FWIW,有几个库可以使使用双数组进行操作变得简单。特别是您应该检查(专门的数组操作),(支持多种类型的向量/矩阵操作,包括双数组)和(与core.matrix一起使用,将双数组包装为通用向量)

这里有JVM签名的描述:

谢谢,这很有意义。为什么
(进入数组(双数组…)
返回一个装箱值数组,而
(进入数组(重复2(双数组…))
返回一个未装箱值数组?
(进入数组(重复2(双数组…)
返回基本双精度数组的数组,而不是非固定双精度数组。