java - java中返回多个值的最轻量级方法

标签 java arrays algorithm code-analysis

我可以想到两种方法来做到这一点:

  • 选项 1 返回值数组
  • 选项 2 创建特定于数据类型的类

在我的具体案例中,我正在处理 martix 的指标。我想分析一下哪个更轻量:

选项 1

new int[] {1, 2}
  • 数组 24 字节
  • 每个 int 2 * 4 字节
  • 总计 32 字节

选项 2

private final class Location {
    public final int i;
    public final int j;

    public Location (int i, int j) {
        this.i = i;
        this.j = j;
    }
}
  • 对象 16 字节
  • 每个 int 2 * 4 字节
  • 填充 4 个字节以舍入为 8 的倍数
  • 总计 32 字节

看起来它们在内存方面是等效的,这是正确的吗?

还有其他考虑因素哪个更快?例如访问 Location 对象属性或索引数组更快吗?我使用的是 64 位,java 6,这相关吗?

最佳答案

如果目标是最小化堆分配量,则数组和对象之间的差异就不那么重要了。如果您设计 API 时不必强制每次调用都分配一个新对象,那么将实现更大的节省。有几种方法:

  1. 依靠逃逸分析来完成它的任务并将对象的数据放置在堆栈上。目前这仅适用于适当的对象,不适用于数组。
  2. 指定契约,使返回的对象是一个单例,供所有方法调用共享。
  3. 设计 API,以便将可变对象传递给方法,然后该方法更新该对象。

方案 1 的缺点是不可行。您可能会也可能不会从 EA 中受益。

选项 2 的缺点是,如果您想积累多次调用的数据,则需要手动将数据复制到其他位置。

选项 3 是最好的,因为它让调用者可以控制分配的内容和时间。任何东西都可以隐藏在作为数据容器传入的类型的抽象后面。它可以例如将数据直接推送到输出流中。

最后一点,如果您的问题实际上非常具体,并且仅返回两个 int ,那么返回一个 long 并具有辅助方法确实有意义将两者 pry 开。

关于java - java中返回多个值的最轻量级方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33420202/

相关文章:

java - 如何在 Swing 应用程序中运行 Javafx 舞台/场景?

javascript - 如何使用两个属性对对象数组进行排序,但根据条件按排序顺序有条件地分组?

algorithm - 常量内存库采样,O(k) 可能吗?

algorithm - 将序列转换为 lex 顺序

c - C 中的数组 : Function which shows whether or not an array contains a certain element

java - 我如何在 Twitter4j 中获取 RateLimitStatus 对象?

java - 使用外键从 JSON 反序列化

javascript - 对数组对象进行降序排序(最大长度优先。)

java - 首次尝试使用链接参数失败的 Facebook 发布

c - 如何直接比较数组中的第一个和第二个元素?