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

时间:2015-10-29 16:51:19

标签: java arrays algorithm code-analysis

我可以想到两种方法:

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

在我的具体情况下,我正在处理马蒂克斯的指示。我想分析哪个更轻量级:

选项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,这是相关的吗?

1 个答案:

答案 0 :(得分:2)

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

  1. 依靠Escape Analysis来完成它并将对象的数据放在堆栈上。目前,这仅适用于正确的对象,而不适用于数组。
  2. 指定合同,使得返回的对象是单例,为所有方法调用共享。
  3. 设计API,以便将可变对象传递给方法,并且方法更新对象。
  4. 选项1的缺点是它不可行。您可能会或可能不会从EA中受益。

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

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

    最后一点,如果你的问题实际上是非常具体的,并且只返回两个int,那么返回long并使用帮助方法将两者分开是有意义的。