我正在构建一个每天处理中等数据量的Java后端组件。我们有一个POJO,我们称之为Widget
,它有大约10个属性。我的软件必须处理Widget
列表组:本质上还有其他进程(完全不同的系统)将它们自己的List<Widget>
放在一起,然后将它们发送到我的软件。我的软件实际收到的包装POJO,看起来像这样:比双重嵌套的ArrayList更高效吗?
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
列表的数据结构。将会有大约500,000个组List<Widget>
(外部ArrayList
),并且每个List<Widget>
将各自具有大约5个Widget
;在内部ArrayList
的总共约250万Widget
s。
在最近的代码审查中,一些技术负责人告诉我,我为这个批处理小部件选择了错误的数据结构。他们告诉我,我应该使用HashMap<String,List<Widget>>
,因为它更高效,更容易使用。 hashmap密钥是我的软件给出的Payload
中包含的GUID。不是因为任何原因我需要GUID,它只是保持〜500,000 List<Widget>
独立的关键 - 我确实需要这样做。
这让我想到:谁是对的?!?我们在这个数据结构上做的唯一操作是“增加”(在ArrayList
的情况下,只需通过add(...)
添加Widget
或List<Widget>
)然后“读取”(在我的软件中,我必须遍历每个Widget
并检查。它的东西与我的嵌套ArrayList
它的要点是:
for(List<Widget> widgetList : myDoublyNestedArrayOfWidgets) {
for(Widget widget : widgetList) {
...
}
}
这些都是我们所需要的只是操作:添加不同List<Widget>
s到一些大“批量”数据结构,然后在以后的时间,检查所有这些软件,并与每个Widget
一起做这个软件。这个软件运行在一些内存和处理能力都很强大的服务器上。
所以我问:**是ArrayList<ArrayList<Widget>>
正确的选择,HashMap<String,List<Widget>>
,还是别的......为什么?
我觉得你说的很多东西不是回答核心问题所必需的。试着把它看作是列举事实而不是讲故事。 – Dukeling 2013-02-14 13:10:15
如果你一起处理所有东西,你可以使用'ArrayList',并在进入主列表时添加Widget?另外,在开始处理之前是否需要全部500k套,或者是否可以处理每个小列表,并将结果存储起来。产生一个处理每个小列表的线程,然后在完成后抛出列表可能会提高内存效率 –
Windle
2013-02-14 13:12:10
在附注中,您的用户名让我大笑=) – Windle 2013-02-14 13:14:18