gpt4 book ai didi

java - 将原语的动态列表传递给 Java 方法

转载 作者:行者123 更新时间:2023-11-30 11:49:32 25 4
gpt4 key购买 nike

我需要将原语的动态列表传递给 Java 方法。这可能是 (int, int, float) 或 (double, char) 或其他。我知道那是不可能的,所以我在想这个问题的有效解决方案。

因为我在 Android 上开发游戏,我想尽可能避免垃圾收集,所以我不想使用任何对象(例如,因为自动装箱),而只使用原始数据类型。因此,在我的情况下,原始类对象(例如 Integer)的集合或数组不是一个选项。

所以我在考虑是否可以将一个类对象传递给我的方法,该方法将包含我需要的所有原始值。但是,这既不是我的问题的解决方案,因为如前所述,基元列表是可变的。因此,如果我在我的方法中采用这种方式,那么我将不知道如何访问这个动态基元列表(至少在没有任何对象转换的情况下,这是我想避免的)。

现在我觉得这里有点迷茫。我不知道 Java 中如何解决我的问题的任何其他可能方式。我希望这只是我缺乏知识。你们中有人知道无需与对象进行相互转换的解决方案吗?

最佳答案

提供更多上下文并准确解释您希望使用此技术的目的可能会很有用,因为这可能是决定最佳方法所必需的。

从概念上讲,您正在尝试做一些在托管堆栈上传递参数的语言中总是困难的事情。你期望可怜的编译器做什么?它要么允许您将任意数量的参数压入堆栈并使用一些堆栈指针算法访问它们(在 C 中很好,它可以让您随心所欲地使用指针,但在 Java 等托管语言中则不太好)或者它会需要传递对其他地方存储的引用(这意味着分配或某种形式的缓冲区)。

幸运的是,有几种方法可以在 Java 中进行高效的原始参数传递。以下是我列出的最有前途的方法,大致按照您应该考虑的顺序排列:

  • 重载 - 拥有多个具有不同原始参数的方法来处理所有可能的组合。如果参数数量相对较少,可能是最好/最简单/最轻量级的选择。性能也很好,因为编译器将静态计算出要调用的重载方法。
  • 原始数组 - 传递任意数量的原始参数的好方法。请注意,您可能需要保留一个原始数组作为缓冲区(否则您将不得不在需要时分配它,这违背了避免分配的目标!)。如果您使用部分填充的原始数组,您还需要将偏移量和/或计数参数传递到数组中。
  • 传递具有原始字段的对象 - 如果原始字段集事先相对已知,则效果很好。请注意,您还必须保留该类的一个实例作为缓冲区(否则您将不得不在需要时分配它,这违背了避免分配的目标!)。
  • 使用专门的原始集合库 - 例如Trove图书馆。出色的性能并节省您编写大量代码的时间,因为这些通常是设计和维护良好的库。如果这些原语集合将长期存在,那么这是一个非常好的选择,也就是说,您创建集合并不是纯粹为了传递一些参数。
  • NIO Buffers - 在性能方面大致相当于使用数组或原始集合。它们有一些开销,但如果您出于其他原因需要 NIO 缓冲区(例如,如果基元在使用相同缓冲区类型的网络代码或 3D 库代码中传递,或者如果数据需要被传递到/从 native 代码)。他们还会为您处理偏移量和计数,这很有帮助。
  • 代码生成 - 编写代码为专门的原始方法(提前或动态)生成适当的字节代码。这不适合胆小的人,而是获得绝对最佳性能的一种方法。您可能想要使用像 ASM 这样的库,或者选择一种可以轻松为您生成代码的 JVM 语言(想到 Clojure)。

关于java - 将原语的动态列表传递给 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8350129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com