我正在构建一个每天处理适量数据的 Java 后端组件。我们有一个 POJO,我们称之为它Widget
,它上面有大约 10 个属性。我的软件必须处理多组Widget
列表:本质上还有其他进程(完全不同的系统)将它们自己组合在一起List<Widget>
,然后将它们发送到我的软件。我的软件实际上收到了一个如下所示的包装 POJO:
public class Payload {
private List<Widget> widgets; // <-- what I want
private String guid; // GUID; my software doesn't need this
private boolean fizz; // again, my software doesn't need this
... many other properties that I don't care about
}
我的软件聚合了所有这些List<Widget>
,每个都由不同的系统创建,然后将它们一起处理成一个大批量。
我已经初步选择了ArrayList<ArrayList<Widget>>
作为保存这批Widget
列表的数据结构。List<Widget>
(外ArrayList
)大约有500,000组,每组List<Widget>
大约有5s Widget
;内部总共有约 250 万Widget
秒ArrayList
。
在最近的一次代码审查中,一些技术负责人告诉我,我为这批 o' 小部件选择了错误的数据结构。他们告诉我我应该使用HashMap<String,List<Widget>>
,因为它更高效且更易于使用。hashmap 键是包含在Payload
我的软件提供的 GUID 中。并不是说我出于任何原因都需要 GUID,它只是作为将 ~500,000List<Widget>
分开的关键——我确实需要这样做。
这让我想:谁是对的?!?我们在这个数据结构上做的唯一操作是“添加”(在 的情况下ArrayList
,只是添加一个Widget
或一个List<Widget>
via add(...)
)然后“读取”(在我的软件中,我必须遍历每一个Widget
并检查它的东西。用我嵌套ArrayList
的要点是:
for(List<Widget> widgetList : myDoublyNestedArrayOfWidgets) {
for(Widget widget : widgetList) {
...
}
}
这些是我们需要的唯一操作:将不同List<Widget>
的 s 添加到一些大的“批量”数据结构中,然后在稍后检查所有这些并处理每个 s Widget
。该软件在一些具有大量内存和处理能力的增强型服务器上运行。
所以我问:**是ArrayList<ArrayList<Widget>>
正确的选择HashMap<String,List<Widget>>
,还是别的什么......为什么?