FloatArray 与 Array<Float>:它们为何不同

Mes*_*npe 3 arrays kotlin

如果答案很明显,我很抱歉,但我不明白。我有一个接受 a 的函数,FloatArray所以我将 a 传递Array<Float>给它,但它拒绝了它!我认为FloatArray这只是另一种创造方式Array<Float>。有什么不同?

gid*_*dds 5

简短的回答:一个是基元数组,另一个是对象引用数组Float

\n

在 Kotlin 中,差异大多是隐藏的,因此要解释,最好返回 Java\xe2\x80\xa6

\n

Java 有九种基本类型(如果我没数错的话)。\xe2\x80\x82 其中八个直接保存值:booleanbyteshortcharintlongfloatdouble\xe2\x80\x94 这些称为 \xe2\x80\x98primitives \xe2\x80\x99.\xe2\x80\x82另一种类型是引用它可以指向对象或数组的实例。

\n

因为在某些情况下,您需要将这些原始值之一作为对象传递,所以 Java 还提供了一些简单包装原始值的对象java.lang.Booleanjava.lang.Byte等。\xe2\x80\x82 每种原始类型都有一个对象。

\n

大多数代码直接使用基元,但有时能够传递对象引用会很方便。\xe2\x80\x82(一方面,基元不可为空,因此如果您需要支持 null,那么您需要一个对象引用。\xe2\x80\x82对于另一个通用代码,例如List和集合框架中的其他类)只能处理对象引用。)

\n

然而,对象包装器的效率较低,因为每个实例都是一个完整的对象并占用一定量的内存(例如 16\xe2\x80\x9332 字节,具体取决于 Java 运行时)\xe2\x80\x94对它的引用的大小(可能是 8 个字节)。\xe2\x80\x82JVM 缓存常用的包装器(例如,布尔值的 true 和 false,以及一些小数字),但对于其他任何内容,您将在其上创建新对象堆。

\n

包装器与基本类型 \xe2\x80\x94 明显不同,它们是大写的(并且,在 的情况下Integer,拼写不同)。\xe2\x80\x82在 Java 的早期版本中,它们是不可互换的;你需要显式地包装(例如Int(someValue))和展开(例如someReference.intValue() \xe2\x80\x99,在许多情况下编译器会为你执行此操作。\ xe2\x80\x82这有点模糊了区别,但大多数时候你仍然需要注意它。

\n

Kotlin 的好处之一是它消除了 Java 的一些不必要的复杂性。\xe2\x80\x82实现此目的的方法之一是几乎完全隐藏这种区别。\xe2\x80\x82Kotlin 语言没有基元:一切看起来都一样\xe2\x80\x82 但是,出于效率考虑,编译后的 Kotlin 在可能的情况下在 \xe2\x80\x99 下使用原语 \xe2\x80\x98。\xe2\x80\x82 例如:

\n
var i: Int\n
Run Code Online (Sandbox Code Playgroud)\n

这声明了一个Int值 \xe2\x80\x94 ,它将存储为原始字段。\xe2\x80\x82但是:

\n
var i: Int?\n
Run Code Online (Sandbox Code Playgroud)\n

这声明了对整数包装器的引用。\xe2\x80\x82(这是因为基元不可为空,因此基元不能存储空值。)

\n

这是一个实现细节:大多数时候,当你编写 Kotlin 时,你不需要意识到这一点。 \xe2\x80\x82 但在运行时区别仍然存在,数组是罕见的之一时间变得可见:

\n
    \n
  • FloatArray是一个基元数组。\xe2\x80\x82它使用最少的内存,并与使用类型的 Java 代码进行互操作float[]

    \n
  • \n
  • Array<Float>是对象引用的数组Float。\xe2\x80\x82它更灵活,并且可以与使用Float[]类型的Java代码进行互操作。

    \n
  • \n
\n

所以你可以看到这是两种不同的类型,尽管它们做类似的事情。

\n

如果您正在与现有代码进行互操作,这将控制您应该使用哪一个。\xe2\x80\x82如果您正在编写新代码,那么您可以选择:FloatArray可能会更高效并且使用更少的内存\xe2\ x80\x94 但Array<Float>往往在其他代码中得到更好的支持(这些代码可能能够通过接受泛型来处理所有相关类型Array,而不必支持FloatArray and IntArray LongArray所有其他类型)。

\n