结构体数组还是数组结构体?

6

嗯,我有一个由结构体组成的数组表格需要存储在Java中。不加考虑内存的朴素方法是这样的:

public class Record {
  final private int field1;
  final private int field2;
  final private long field3;
  /* constructor & accessors here */
}

List<Record> records = new ArrayList<Record>();

如果我最终使用大量(> 106)的记录,其中单个记录偶尔一次访问一个,那么我该如何确定前面提到的方法(ArrayList)与优化存储成本的方法相比如何?
public class OptimizedRecordStore {
  final private int[] field1;
  final private int[] field2;
  final private long[] field3;

  Record getRecord(int i) { return new Record(field1[i],field2[i],field3[i]); }
  /* constructor and other accessors & methods */
}

编辑:

  • 假设记录数量很少更改或从未更改
  • 我可能不会使用OptimizedRecordStore方法,但我想了解存储成本问题,以便我可以有信心做出决定。
  • 显然,如果我在上述OptimizedRecordStore方法中添加/更改记录的数量,我要么必须用新对象替换整个对象,要么删除“final”关键字。
  • kd304提出了一个我心中有的好观点。在类似于此的其他情况下,我需要对记录进行列访问,例如,如果field1和field2是“时间”和“位置”,并且重要的是将这些值作为数组获取以便与MATLAB一起使用,以便可以高效地进行图形化/分析。

这个优化是怎么实现的?你是指成员对齐吗? - EFraim
每个记录对象都会产生存储成本(4字节?8字节?我不知道),并且创建每个对象都会产生性能成本。如果我只有1000个,我不在乎。但是如果我有100,000或1,000,000个,我就开始关心了。 - Jason S
11个回答

1
因为你将int[]字段设为final,所以你只能使用数组的一个初始化。因此,如果你想要10^6个field1,Java就需要为每一个int[]分配那么多内存,因为你无法重新分配数组的大小。而使用ArrayList,如果你事先不知道记录的数量,并且可能会删除记录,那么你可以节省大量的空间,并在后续删除记录时也能节省空间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接