我可以想到两种方法来做到这一点:
- 选项 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 时不必强制每次调用都分配一个新对象,那么将实现更大的节省。有几种方法:
- 依靠逃逸分析来完成它的任务并将对象的数据放置在堆栈上。目前这仅适用于适当的对象,不适用于数组。
- 指定契约,使返回的对象是一个单例,供所有方法调用共享。
- 设计 API,以便将可变对象传递给方法,然后该方法更新该对象。
方案 1 的缺点是不可行。您可能会也可能不会从 EA 中受益。
选项 2 的缺点是,如果您想积累多次调用的数据,则需要手动将数据复制到其他位置。
选项 3 是最好的,因为它让调用者可以控制分配的内容和时间。任何东西都可以隐藏在作为数据容器传入的类型的抽象后面。它可以例如将数据直接推送到输出流中。
最后一点,如果您的问题实际上非常具体,并且仅返回两个 int
,那么返回一个 long
并具有辅助方法确实有意义将两者 pry 开。
关于java - java中返回多个值的最轻量级方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33420202/