gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:49:07 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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

选项 1 的缺点是不可靠。您可能会也可能不会从 EA 中受益。

选项 2 的缺点是,如果您想从许多调用中累积数据,则需要手动将数据复制到其他地方。

选项 3 是最好的,因为它让调用者可以控制分配什么以及何时分配。任何东西都可以隐藏在您作为数据容器传入的类型的抽象背后。它可以例如将数据直接插入输出流。

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

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

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